在我们的讲座中,我们有以下这个例子:
它被展示为一个不好的例子,但未作进一步解释。这是为什么不好的呢?
int *foo(int x) {
return &x;
}
int* pt = foo(x);
*pt = 17;
它被展示为一个不好的例子,但未作进一步解释。这是为什么不好的呢?
不好的地方在于您正在返回一个指向自动局部变量的指针。一旦函数返回,它将不再存在,然后语句*pt = 17;
将导致程序表现异常。
可以返回指向静态局部变量的指针。
int *foo() {
static int x;
return &x;
}
int* pt = foo();
*pt = 17;
foo
函数中,变量x
是局部的,因此在方法退出后它将不再存在。当一个函数返回时,它的自动、局部变量被丢弃,所以在这种情况下返回的指针是无效的(它指向一个已经不存在的数组)。int* pt = foo(x);
*pt = 17;
pt
会产生未定义行为。相反,您应该使用malloc
来分配它:int *foo()
{
int *x = malloc(sizeof(int));
*x = 0;
return x;
}
int* pt = foo();
*pt = 17;
free(pt);
在这里
int *foo(int x) {
x
是一个本地的、非静态的变量。通过这样做,
return &x;
你返回了局部变量x
的地址。只要函数存在,它就存在,当函数退出时,该地址对你来说将无效。通过使用
*pt = 17;
17
写入该无效内存位置。这会触发未定义行为。这就是为什么给定的代码不好的原因。