如果我有一个int数组:
int *array;
array = malloc(5 * sizeof(int));
和我上面的malloc,然后我可以访问它并为其设置值。一切都很好。
但是如果我创建那个int指针并向它传递一个函数和malloc 里面的函数,我就无法访问/设置数组的值< em>除非我将它作为指针传递给数组?
some_void_function(int *array) {
array = malloc(5 * sizeof(int))
}
int *array;
some_void_function(array);
*(array + 3) = 5; // DOES NOT WORK
要修复它,我可以使数组accept(int ** array)作为参数并传入指针的地址(所以指向指针的指针),取消引用它,并用malloc赋值:
some_void_function(int **array) {
*array = malloc(5 * sizeof(int))
}
int *array;
some_void_function(&array);
*(array + 3) = 5; // WORKS
有人可以向我解释一下吗?我在两种情况下都没有做同样的事情吗?传递地址,然后只是解除引用它就像在第一个位置传入单个指针一样吗?
答案 0 :(得分:2)
指针是保存地址的变量。但它们与所有其他类型的变量遵循相同的规则,这意味着它们是按值传递的。
void some_void_function(int *array) {
array = malloc(5 * sizeof(int))
}
array
位于some_void_function
的本地,您对其值所做的任何更改都不会反映在复制指针中。
要修改调用代码中的变量(包括指针),您有两个选择:
通过指针,这意味着指向指针的指针:
void some_void_function(int **array) {
*array = malloc(5 * sizeof(int))
}
返回您分配的地址并将其指定给指针:
int* some_allocating_function() {
return malloc(5 * sizeof(int))
}
//...
int *array = some_allocating_function();
答案 1 :(得分:2)
那是因为c通过值传递参数
some_void_function(int *array) {
array = malloc(5 * sizeof(int))
}
此代码只修改array
的本地副本,它不会更改array
的调用者副本
此代码
some_void_function(int **array) {
*array = malloc(5 * sizeof(int))
}
传递调用者数组的地址,这允许你伸出你的函数并更改调用者数组指针