C指针示例 - 这有什么不好的?

时间:2015-04-28 11:26:22

标签: c pointers

在我们的讲座中,我们有以下例子:

int *foo(int x) {
    return &x;
}

int* pt = foo(x);
*pt = 17;

它被证明是一个不好的例子,但没有进一步解释。为什么这么糟糕?

3 个答案:

答案 0 :(得分:5)

不好的是你正在返回一个指向自动局部变量的指针。一旦函数返回它将不再存在,然后语句*pt = 17;将导致程序行为不规律。

可以返回指向static局部变量的指针。

int *foo() {
    static int x;
    return &x;
}
int* pt = foo();
*pt = 17; 

答案 1 :(得分:4)

foo中,变量x是本地的,因此在方法退出后它不再存在。当函数返回时,它的自动局部变量将被丢弃,因此在这种情况下返回的指针无效(它指向一个不再存在的数组)。

int* pt = foo(x);
*pt = 17; 

因此,现在访问pt会产生Undefined Behavior。您应该malloc代替:

int *foo() 
{
    int *x = malloc(sizeof(int));
    *x = 0;
    return x;
}

int* pt = foo();
*pt = 17;
free(pt);

答案 2 :(得分:4)

下面

int *foo(int x) {

x是一个本地的非静态变量。通过做

return &x;

返回局部变量x的地址。它只要函数存在就会存在,当函数退出时,这个地址对你来说无效。使用

*pt = 17;

您取消引用此地址并将17写入此无效内存位置。这会触发Undefined Behavior。这就是给定代码不好的原因。