静态存储区的内存四区

17 篇文章 1 订阅

一、操作系统是如何执行exe程序的?

1、操作系统首先把物理磁盘代码load到内存;

2、操作系统把C代码分成四分区;

3、操作系统找到main函数入口执行

二、内存四区

1、栈区:局部变量存放的位置,因为局部变量出了作用域会被析构释放空间,所以也叫临时区;

2、堆区:需要手动分配和释放内存的区,由malloc和new分配,free和delete释放;

3、全局区:全局变量,静态变量,常量存放的位置,相同的常量在该区只会保存一份,全局区归操作系统管理;

4、代码区:顾名思义,存放代码的。

三、示例

#include"stdio.h"
#include"stdlib.h"
#include"string.h"

char* getval1() {
    char* p1 = "abcdefg";
    return p1;
}

char* getval2() {
    char* p2 = "abcdefg";
    return p2;
}

int main() {
    char* p1 = NULL;
    char* p2 = NULL;
    p1 = getval1();
    p2 = getval2();
    printf("*p1 : %s, *p2 : %s\n", p1, p2);
    printf("p1 : %d, p2 : %d\n", p1, p2);
    system("pause");
    return 0;
}

输出结果:

这里写图片描述

可以发现main函数中的p1和p2指向同一个地址,这里画图解释一下:

这里写图片描述

首先main函数两个指针变量压栈,调用getval1函数,getval1函数中的局部变量p1压栈,此时指向了常量“abcdefg”,常量是放在全局区的,函数返回后p1这个变量被析构了,但他指向的全局区的首地址还是存在的,所以main函数中的p1也指向了全局区的“abcdefg”的首地址。此时getval1函数弹栈:

这里写图片描述

调用getval2函数的时候,getval2函数压栈,getval2函数中的p2指向的常量仍然是“abcdefg”,编译器会进行优化,在全局区只保留一个“abcdefg”, 所以getval2函数中的p2同样指向4287280这个地址,getval2函数返回后,p2被析构掉了,但其指向的地址还在,所以main函数中的p2也指向了4287280这个地址,最后main函数中的p1和p2指向的地址是一样的。

四、字面值

对于

int j = 0;

这个0是存放在哪里的呢,因为0是不能取地址的,所以不能放在栈区,堆区和全局区,一般认为是放在代码区的。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值