此问题在此处已有答案:
malloc in a function doesn't work well(3个答案)
4天前关闭。
我很熟悉这段代码来修改一个数组,在一个函数中调用它arr
:
void foo(int *arr) {
arr[0] = 3;
}
int main() {
int arr[] = { 1, 2, 3, 4 };
foo(arr);
printf("new value: %d\n", arr[0]); // prints 3
}
但是现在假设我在main
中有一个指针,我想把它当作一个数组。
int main() {
int *p;
}
在我的函数foo
中,现在我分配了no整数来存储在p
中,并更改它们的值或任何东西来更改初始数组。
void foo(int *arr, int no) {
arr = (int *)malloc(no * sizeof(*arr));
// some code to change the array
arr[0] = 1;
}
现在如果我用一个随机值调用foo
函数,然后尝试打印数组的第一个元素,我会得到一个空白屏幕,我不明白为什么。
在函数中,我将指针的引用改为动态分配的数组,所以没有问题。
最简单的修复方法是返回数组,而不是将其作为指针传递。
int *foo(int no) {
arr = (int *)malloc(no * sizeof(*arr));
// some code to change the array
arr[0] = 1;
return arr;
}
同样在main
函数中,我将简单地使用int* p = foo(10);
,这是最简单的修复方法。
我想知道为什么传递指针不会打印任何东西。
2条答案
按热度按时间hyrbngr71#
对
arr
(arr = ...
)的赋值与对任何参数的赋值有相同的问题。例如,你不会期望对no
的赋值(例如no = 5;
)在函数中起作用?为了能够修改函数中的任何数据,函数需要一个指向数据的指针。如果你想修改一个指针,那么你需要一个指向该指针的指针:
你需要使用指针操作符来传递它:
pbossiut2#
函数
foo
定义为:分配一个数组并初始化它的第一个元素,但是作为
foo(p)
传递给foo
的调用方变量p
没有被修改,只有局部参数arg
得到更新,并且当函数返回时其最终值丢失,导致分配的内存不可访问(* 内存泄漏 *)。将指针
p
的未初始化值传递给foo
是没有意义的(实际上它有未定义的行为),您必须返回foo
中分配的指针,并将此返回值存储到main
中的局部变量: