关闭

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

标签: 林仕鼎-百度
1103人阅读 评论(0) 收藏 举报
分类:

先看如下代码, 在编译运行的时候会抛出警告——-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语言程序时候, 如果返回指针(变量地址),应该返回堆区或者全局区的,这样就可以避免这个”意想不到的”结果

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    文章分类
    最新评论