关于局部变量

问题代码:

#include <iostream>

int *foo()
{
    int a = 5;
    return &a;
}

int main()
{
    int *p = foo();
    std::cout << *p;
    *p = 8;
    std::cout << *p;
}

最后会打印:58

理论上,a是局部变量,所以a的地址在foo()函数返回时就释放了,那为什么还能读取到5这个值呢。

我个人的理解: 虽然a的地址被释放了,但是地址所指向的值并没有被释放,也就是说如果没有其他行为来修改这个地址上的值,那么5会一直存在,直到被修改。

这个行为是不好的,虽然还可以读取5,但是并不代表5这个值是安全的,我们不知道会有什么样的行为会改变它,因此它可以是5也可以是一个随机数,并且在编译的时候,编译器也会给出警告。

拓展:局部变量是栈上的,由系统自动分配地址,每个线程都有一个独立的栈,线程退出后,不会清除栈中的数据,只是释放和清理其中的一些申请的资源(如果我说错了,请告诉我)

          堆是程序员手动申请的,不受系统监管,堆是进程拥有的,线程之间共享。

最后,在申请内存时,要养成初始化的习惯。

附上一份资料:

代码区 – 程序的代码(以函数的形式)存入代码区,函数指针就是函数在代码取得地址,代码区 是 只读区域.

只读常量区 – 很多的书上都把只读常量区归入代码区,存放字符串的字面值(“abc”)和const修饰的全局变量。

全局区 – 存放全局变量和static的局部变量,读写权限。

BSS段 – 存放为初始化的全局变量(没有写=的),读写权限。全局区和BSS段区别在于:虽然两者都是在main运行前创建,但BSS段不会在 main()执行之前自动清0,而全局区会。

栈区(stack) - 也叫堆栈区 ,存放局部变量(没有static),函数的形参也是在栈区。

堆区 (heap)- 也叫自由区,是程序员完全管理的区域,系统不会管理这个区域。

原文链接: https://www.cnblogs.com/strive-sun/p/11805839.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    关于局部变量

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/405069

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年4月25日 下午4:52
下一篇 2023年4月25日 下午4:52

相关推荐