【发布时间】:2015-04-28 11:26:22
【问题描述】:
在我们的讲座中,我们有以下示例:
int *foo(int x) {
return &x;
}
int* pt = foo(x);
*pt = 17;
这是一个不好的例子,但没有进一步解释。为什么这样不好?
【问题讨论】:
在我们的讲座中,我们有以下示例:
int *foo(int x) {
return &x;
}
int* pt = foo(x);
*pt = 17;
这是一个不好的例子,但没有进一步解释。为什么这样不好?
【问题讨论】:
坏事是你返回一个指向自动局部变量的指针。一旦函数返回,它将不再存在,然后语句 *pt = 17; 将导致程序行为异常。
可以返回指向static 局部变量的指针。
int *foo() {
static int x;
return &x;
}
int* pt = foo();
*pt = 17;
【讨论】:
这里
int *foo(int x) {
x 是一个局部的非静态变量。通过做
return &x;
您返回局部变量x 的地址。只要函数存在,它就存在,当函数退出时,这个地址就失效了,你不能玩。通过使用
*pt = 17;
您取消引用此地址并将17 写入此无效内存位置。这会触发Undefined Behavior。这就是给定代码不好的原因。
【讨论】:
在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);
【讨论】: