C - 函数参数和指针

时间:2016-05-11 14:23:27

标签: c pointers malloc pass-by-value

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

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

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

2 个答案:

答案 0 :(得分:0)

有两件事你正在改变:

  • 功能类型
  • 功能调用

由于您要修改指针值,因此必须提供指向int的指针。

请参阅指向指针的resources

答案 1 :(得分:0)

C使用pass by值进行函数参数传递。

  • 在第一种情况下,通过传递指针的地址 main(),您就可以更改指针本身。因此,即时Convert(),您的更改 已反映

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