C语言中返回局部变量或临时变量的地址的错误

先看如下代码, 在编译运行的时候会抛出警告——-warning C4172: 返回局部变量或临时变量的地址,并且在main函数中的打印结果不符合我们的预期

代码如下:

int* visitArea(){
    int a = 10;
    return &a;
}


int main(){
    int* a = visitArea();
    printf("%d\n", *a);
    printf("%d\n", *a);
    printf("%d\n", *a);
    return 0;
}

打印结果:

10
-2
-2
请按任意键继续. . .

我们通过上面可以发现main函数调用visitArea ,返回visitArea中的局部变量的地址,然后赋值给main函数中的变量进行打印, 第一个printf语句打印出了符合我们预期的结果,但是接下来的两个语句打印的结果不符合我们的预期, 这是为什么呢?

在C语言中,局部变量是分配在栈空间上的, 当函数调用结束后,他由编译器释放. 我们通过调用visitArea得到了他的局部变量的内存地址, 然而在第二次打印的时候他这个内存地址被”破坏”了, 所以出现了这个意想不到的结果.

所以我们在书写C语言程序时候, 如果返回指针(变量地址),应该返回堆区或者全局区的,这样就可以避免这个”意想不到的”结果

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ic_tv/article/details/46775905
文章标签: 林仕鼎-百度
个人分类: C
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭