考虑两种调用函数的情况:
void Convert(int number, int **staticPointer)
{
int * dynamicPointer = malloc(sizeof(int));
*dynamicPointer = number;
*staticPointer = dynamicPointer;
}
int main()
{
int *p;
Convert(5, &p);
printf("The number is: %d", *p);
free(p);
}
上述工作非常精彩,没有任何问题。
现在的情况如下:
void Convert(int number, int *staticPointer)
{
int * dynamicPointer = malloc(sizeof(int));
*dynamicPointer = number;
staticPointer = dynamicPointer;
}
int main()
{
int *p;
Convert(5, p);
printf("The number is: %d", *p);
free(p);
}
这会导致SEGFAULT。请注意,我使用不同的参数以不同的方式调用函数,我确实理解不同之处在于调用函数。
有人可以向我解释为什么我必须在第一个例子中调用该函数,以及为什么另一个例子不起作用(它在main中崩溃)?
我的程序的目的是通过函数引用指向特定内存地址的静态指针。
答案 0 :(得分:0)
答案 1 :(得分:0)
C使用pass by值进行函数参数传递。
在第一种情况下,通过传递指针的地址 main()
,您就可以更改指针本身。因此,即时Convert()
,您的更改 已反映。
在第二种情况下,指针本身无法更改,因为它本身是按值传递的。从p
函数返回后,对main()
所做的任何更改都将丢失。因此,在*p
中,您将访问无效的内存({{1}}),其中包含undefined behavior。因此崩溃。