gpt4 book ai didi

C-函数参数和指针

转载 作者:行者123 更新时间:2023-11-30 21:01:04 25 4
gpt4 key购买 nike

考虑调用函数的两种情况:

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 中崩溃)?

我的程序的目的是通过函数引用指向特定内存地址的静态指针。

最佳答案

C 使用按值传递来传递函数参数。

  • 在第一种情况下,通过传递指针的地址 p,您可以更改指针本身。因此,在 main() 中,您的更改得到反射(reflect)

  • 在第二种情况下,指针本身无法更改,因为它本身是按值传递的。从 Convert() 函数返回后,对 p 所做的任何更改都将丢失。因此,在 main() 中,您将访问无效内存 (*p),这会调用 undefined behavior 。因此崩溃了。

关于C-函数参数和指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37165553/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com