在c中动态增加数组大小(int*)
我想在c中向数组动态添加数字。我的想法是只分配一个大小为+1的新数组,添加数字,释放根数组,并将指针从临时数组更改为根数组。像这样:在c中动态增加数组大小(int*),c,arrays,pointers,int,C,Arrays,Pointers,Int,我想在c中向数组动态添加数字。我的想法是只分配一个大小为+1的新数组,添加数字,释放根数组,并将指针从临时数组更改为根数组。像这样: void addNumber(int* a, int* size, int number) { *size = *size + 1; int* temp = (int*)(calloc(*size, sizeof(int))); int i, j = 0; for(i = 0; i < *size-1; i++) {
void addNumber(int* a, int* size, int number)
{
*size = *size + 1;
int* temp = (int*)(calloc(*size, sizeof(int)));
int i, j = 0;
for(i = 0; i < *size-1; i++) {
if(a[i] < number) {
printf("add ai");
temp[j] = a[i];
j++;
} else {
printf("add number");
temp[j] = number;
}
}
if(j != *size) {
printf("add new number");
temp[j] = number;
}
free(a);
a = temp;
}
int main(int argc, char* argv[])
{
int n = 10;
int* a;
int size = 1;
a = (int*) (calloc(1, sizeof(int)));
a[0] = 1;
if(!contains(a, size, 2)) {
addNumber(a, &size, 2);
}
printArray(a,size);
return 0;
}
void addNumber(int*a,int*size,int-number)
{
*大小=*大小+1;
int*temp=(int*)(calloc(*size,sizeof(int));
int i,j=0;
用于(i=0;i<*size-1;i++){
if(a[i]<数字){
printf(“添加ai”);
温度[j]=a[i];
j++;
}否则{
printf(“添加编号”);
温度[j]=数量;
}
}
如果(j!=*尺寸){
printf(“添加新编号”);
温度[j]=数量;
}
免费(a);
a=温度;
}
int main(int argc,char*argv[])
{
int n=10;
int*a;
int size=1;
a=(int*)(calloc(1,sizeof(int));
a[0]=1;
如果(!包含(a,大小,2)){
地址编号(a和尺寸,2);
}
打印阵列(a,大小);
返回0;
}
问题在于addNumber函数中的代码有效,*a具有新数组的正确值。但在主函数中,数组*a的值为1,0。因此,不会添加新插入的值2。为什么?我不知道原因
为什么??我不知道原因
这是因为您正在addNumber
中本地修改a
的值。这不会改变main
中a
的值
为了使main
能够访问新分配的内存,您需要更改addNumber
以返回新分配的指针
int* addNumber(int* a, int* size, int number){
...
return a;
}
然后将main
更改为:
if(!contains(a, size, 2)){
a = addNumber(a, &size, 2);
// Assign to a the new pointer value.
}
要动态更改数组大小,可以使用例程。除了可以使用eaiser之外,它还可以比依次调用
free()
和malloc()
的方法更快
可以保证重新分配的块将填充旧内存块的内容
问题在于addNumber函数中的代码有效,*a具有新数组的正确值
代码中有两个主要缺陷。首先,如果您的addNumber()
例程不返回新分配的内存块(因此它被泄漏),则应该使用双指针或返回新块作为函数结果
第二个结果来自第一个-在a
被释放后,您继续对其进行写入
如果您更愿意坚持当前的方法,此修改后的代码应该可以工作:
void addNumber(int** a, int* size, int number)
{
*size = *size + 1;
int* temp = (int*)(calloc(*size, sizeof(int)));
int i, j = 0;
for(i = 0; i < *size-1; i++) {
if((*a)[i] < number) {
printf("add ai");
temp[j] = (*a)[i];
j++;
} else {
printf("add number");
temp[j] = number;
}
}
if(j != *size) {
printf("add new number");
temp[j] = number;
}
free(*a);
*a = temp;
}
int main(int argc, char* argv[])
{
int n = 10;
int* a;
int size = 1;
a = (int*) (calloc(1, sizeof(int)));
a[0] = 1;
if(!contains(a, size, 2)) {
addNumber(&a, &size, 2);
}
printArray(a,size);
return 0;
}
void addNumber(int**a,int*size,int number)
{
*大小=*大小+1;
int*temp=(int*)(calloc(*size,sizeof(int));
int i,j=0;
用于(i=0;i<*size-1;i++){
如果((*a)[i]<编号){
printf(“添加ai”);
温度[j]=(*a)[i];
j++;
}否则{
printf(“添加编号”);
温度[j]=数量;
}
}
如果(j!=*尺寸){
printf(“添加新编号”);
温度[j]=数量;
}
免费(*a);
*a=温度;
}
int main(int argc,char*argv[])
{
int n=10;
int*a;
int size=1;
a=(int*)(calloc(1,sizeof(int));
a[0]=1;
如果(!包含(a,大小,2)){
地址编号(&a,&size,2);
}
打印阵列(a,大小);
返回0;
}
main中的“a”已经是指针,将其传递给函数将传递其副本。您需要做的是-传递地址'&a'并在函数中以双指针'**a'的形式接收它,在函数内部,使用解引用来获取数组中的值(如*a[i]和free(*a)。
将最后一行更改为“return temp”,并在main中将其收集为a=addnumber(&a,&size,2)
顺便说一句,与其经历所有这些麻烦,不如使用realloc()函数。它会动态增加数组的大小。使用realloc后,您可以在最后一个索引处添加新的数字。您要寻找的是。它可以用来增加或缩小内存,同时保留其内容
/* array is now sizeof(int) * new_size bytes */
array = realloc(array, sizeof(int) * new_size);
realloc()
可能会更改现有的内存分配,或者可能会分配一个全新的内存块。这就是为什么将结果重新分配回要重新分配的对象很重要的原因
但是如果addNumber()
通过创建新内存重新分配数组,main()
将不知道它。这与此不起作用的原因相同
void incrementNumber(int num) {
num = num + 1;
}
int num
是一个通过值传递的数字。如果希望它反映在调用方中,则需要将其作为指针传递
void incrementNumber(int *num) {
*num = *num + 1;
}
指针也是一样。它们仍然是数字。int*a
按值传递指针。如果在addNumber
中更改a
,调用者将看不到它。就像以前一样,您需要将其作为指针传递。这样使用的指向指针的指针称为
(请注意,我还传入了数组中元素的大小,这是无法假定的)
这是通过向数组传递指针来调用的
addNumber(&a, &size, sizeof(int), 5);
在那之后,一切都是一样的
for( int i = 0; i < size; i++ ) {
printf("%d ", a[i]);
}
puts("");
这是一个很好的练习,你会学到很多关于静态内存的知识,并改掉很多关于静态内存的坏习惯。但是正确有效地执行动态数据结构是很困难的(例如,一次分配一个额外的插槽是非常低效的)
有许许多多的库提供了这样的动态结构。因此,继续将此作为练习,但对于真正的代码,使用诸如。
a=temp;
之类的库是没有用的。a
是一个局部变量。该赋值不会影响main()的a
<代码> > ReLoCu确实是你想做的。为什么不简单地用RealLoc?@ rpgILeSePe来扩展以前分配的内存,如果这只是一个C++问题……RPGILESEPIE,如果OP不熟悉C++(参见)或者这个C++标记的查看器不熟悉C++,那么提供C++解决方案比集中在C上甚至更重要的价值要小得多。
for( int i = 0; i < size; i++ ) {
printf("%d ", a[i]);
}
puts("");
typedef struct {
int *array;
size_t size;
} IntArray;