在我们的讲座中,我们有以下例子:
int *foo(int x) {
return &x;
}
int* pt = foo(x);
*pt = 17;
它被证明是一个不好的例子,但没有进一步解释。为什么这么糟糕?
答案 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。这就是给定代码不好的原因。