我正在学习 C 并困惑为什么在 main 中创建的数组不会在函数内部发生变化,我假设传递的数组是一个指针,并且更改指针应该会更改数组,对吗?有人可以解释这种情况下发生了什么吗?
感谢您的帮助。
int main(){
int i, length = 10;
int array[length];
for (i = 0 ; i < length ; i++)
array[i] = i * 10;
printf("Before:");
print(array, length);
change(array, length);
printf("After:");
print(array, length);
return 0;
}
// Print on console the array of int
void print(int *array,int length)
{
int i;
for(i = 0 ; i < length ; i++)
printf("%d ", array[i]);
printf("\n");
}
// Change the pointer of the array
void change(int *array,int length)
{
int *new = (int *) malloc(length * sizeof(int));
int i;
for(i = 0 ; i < length ; i++)
new[i] = 1;
array = new;
}
我希望看到以下输出:
Before:0 10 20 30 40 50 60 70 80 90
After:1 1 1 1 1 1 1 1 1 1
我得到的:
Before:0 10 20 30 40 50 60 70 80 90
After:0 10 20 30 40 50 60 70 80 90
最佳答案
在c您不能通过引用传递变量,您在函数内部分配的 array
变量最初包含与传递的指针相同的地址,但它是它的副本,因此修改它不会改变传递的指针。
你需要传递指针的地址才能改变它,就像这样
// Change the pointer of the array
void change(int **array, int length)
{
*array = malloc(length * sizeof(int));
if (*array == NULL)
return;
for (int i = 0 ; i < length ; i++)
(*array)[i] = 1;
}
然后在 main()
中你不能赋值给一个数组,通过这种函数这样做肯定是未定义的行为。 main()
中定义的数组分配在堆栈上,您不能将任何内容分配给数组,因为它们是非可写左值,所以您不能让它指向一个用malloc()
获得的堆内存位置,你需要像这样传递一个指针
int *array;
change(&array, length);
free(array);
如果你想让函数替换之前的数组,它必须free()
malloc()
ed 数据(注意传递NULL
到 free()
定义明确),所以
// Change the pointer of the array
void change(int **array, int length)
{
free(*array);
*array = malloc(length * sizeof(int));
if (*array == NULL)
return;
for (int i = 0 ; i < length ; i++)
(*array)[i] = 1;
}
然后在 main()
int *array;
array = NULL;
change(&array, length);
change(&array, length);
change(&array, length);
change(&array, length);
free(array);
会做你显然想做的事。
关于在 C 函数中更改数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34844003/