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

4
在我们的讲座中,我们有以下这个例子:
int *foo(int x) {
    return &x;
}

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

它被展示为一个不好的例子,但未作进一步解释。这是为什么不好的呢?
3个回答

5

不好的地方在于您正在返回一个指向自动局部变量的指针。一旦函数返回,它将不再存在,然后语句*pt = 17;将导致程序表现异常。

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

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

4
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);

4

在这里

int *foo(int x) {

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

return &x;

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

*pt = 17;

你取消引用此地址并将17写入该无效内存位置。这会触发未定义行为。这就是为什么给定的代码不好的原因。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接