医学分类手机网站模版,企业怎么做好网站优化,一键建网站,wordpress 文章 id目录
内存分区
运行之前
代码区
全局初始化数据区 、静态数据区 (data)
未初始化数据区(bss#xff08;Block Started by Symbol#xff09;区)
总结
运行之后
代码区 #xff08;text segment#xff09;
未初始化数据区(bss)
全局初始化数据区#xff0c;静态…
目录
内存分区
运行之前
代码区
全局初始化数据区 、静态数据区 (data)
未初始化数据区(bssBlock Started by Symbol区)
总结
运行之后
代码区 text segment
未初始化数据区(bss)
全局初始化数据区静态数据区data segment
栈区(stack)
堆区(heap) 内存分区 运行之前
如果要执行一个C程序那么第一步需要对这个程序进行编译。
1预处理宏定义展开头文件展开条件编译这里不会检查语法2编译检查语法将预处理后的文件编译成汇编文件3汇编将汇编文件生成目标文件(二进制) .o文件已生成4链接 将目标文件链接为可执行程序 二进制文件转换可执行文件 类似.ext
当编译完成生成可执行文件之后我们可以通过linux下的size买了查看一个可执行二进制文件基本情况 通过上图可以得知在没有运行程序前也就是说程序没有加载到内存前可执行程序内部已分好3段信息分别是 代码区(text) , 数据区(data) 和未初始化数据区(bss) 3个部分(可以把data和bss合起来叫做静态区或者全局区)
以下是细分
bss区域放未初始化的数据如: static int a; //未初始化数据。 static int a 10 ;//这个时候数据放在数据区 data区。
代码区
存放CPU执行的机器质量。通常代码是可以共享的(即另外的执行程序可以调用它)使其可共享的目的是对于频繁被执行的程序只需要在内存中有一份代码即可。代码通常是只读的使其只读的原因是防止程序意外的修改他的指令。另外代码区还规划了局部变量的相关信息。
说白了代码区就是放代码的
以上重点共享比如我们创建了一个a.exe和a1.exe两个代码是一样然后第一次点击a.exe 第二次点击a1.ext其实运行的还是a.exe原因是代码一样共享
只读比如我们在开发一个游戏币创建了游戏币和人名币两个变量如果是可写的那么吧游戏币写到人名币里面那这样就是大事故所以设置成只读。 全局初始化数据区 、静态数据区 (data)
该区包含了在程序中明确被初始化的全局变量已经初始化的静态变量(包括全局静态变量)和常量数据(字符串常量) 未初始化数据区(bssBlock Started by Symbol区)
存入的是全局未初始化变量和未初始化静态变量。未初始化数据区的数据在程序开始执行之前被内核初始化未0后者空(NULL) 总结
程序源代码被编译之后主要分成两段: 程序指令(代码区) 和 程序数据(数据区) 。代指码段属于程序指令而数据域段和bss段属于程序数据
为什么要分开
程序被加载到内存中之后可以将数据和代码分别映射到两个内存区域。由于数据区域对进程来说是可读可写的而指令域对程序来说是只读的所以区分之后可以将程序指令区域和数据区域分别设置成可读可写或者只读。这样可以防止程序的有意或者无意被修改
当程序中运行着多个同样的程序的时候这些程序执行的指令都是一样的所以只需要内中保存一份程序的指令就可以了只是每一个程序运行中数据不一样而已这样可以节省大量的内存。 运行之后
程序在加载到内存前代码区和全局区(data 和 bss)的大小就是固定的程序运行期间不能改变。然后运行可执行程序操作系统吧物理硬盘程序加载到内存除了根据可执行程序的信息分出代码区(text) , 数据区(data) 和未初始化数据区(bss)之外还额外增加了栈区堆区 代码区 text segment
加载的是可执行文件代码段所有的可执行代码都加载到代码区这块内存是不可以在运行期间修改的
案例
int main() {int a 1; // 这一行对应的机器指令就存储在代码区return 0;
}
未初始化数据区(bss)
加载的是可执行文件bss段位置可以分开亦可以紧靠数据段存储于数据段的数据(全局未初始化静态未初始化数据)的生命周期未整个程序运行过程。
案例 int a; // 存储在BSS段默认值为0static int i; // 局部静态变量默认值也为0存储在BSS段
全局初始化数据区静态数据区data segment
加载的是可执行文件数据段存储于数据段(全局初始化静态初始化数据字符常量(只读))的数据的生存周期为整个程序运行过程。
案例 int a 10; // 存储在数据段static int i 20; // 局部静态变量同样存储在数据段
栈区(stack)
栈是一种先进后出的内存结构由编译器自动分配释放存放函数的参数值返回值局部变量等。在程序运行过程中实时加载和释放因此局部变量的生存周期为申请到释放该段栈空间。
栈的空间是有限的尽量用完就释放掉 1是第一个进入。
如果1想出来那要吧4先扔掉3在扔掉2在扔掉才是1
可以认为吃米饭一样先吃上面的才能见碗底。 堆区(heap)
堆是一个大容器它的容量要远远大于栈但没有栈那样的先进后出的顺序。用于动态内存分配。堆在内存中位于bss区和栈区之间。一般由程序员分配和释放若程序不释放程序结束时由操作系统回收
大容量大容量到底有多大要看机器有多好看机器
分配使用malloc函数分配
释放使用free函数释放 如果不释放程序会在系统结束后回收 注意一定要手动释放
生命周期
类型作用域生命周期存储位置auto变量一对{}内当前函数栈区static局部变量一对{}内整个程序运行期初始化在data段未初始化在BSS段extern变量整个程序整个程序运行期初始化在data段未初始化在BSS段static全局变量当前文件整个程序运行期初始化在data段未初始化在BSS段extern函数整个程序整个程序运行期代码区static函数当前文件整个程序运行期代码区register变量一对{}内当前函数运行时存储在CPU寄存器字符串常量当前文件整个程序运行期data段 栈 注意事项
案例1
int* func() {int a 10;return a;
}void test01()
{int* p func();printf(p %d\n,p);
}
运行结果 从上面结果来看不是我们预期的结果我们预期结果是 p 10
为什么是这样
首先我们来看func函数函数定义的是int a 10, 函数最终返回了a的地址所以a在栈区的值已经释放了我们没有去操作这一块内存。 案例2
char * getMyName()
{char myName[] 达帮主;return myName;
}void test02()
{char* p getMyName();printf(my name p %s\n,p);
}
运行结果 问题与案例1一样也是释放了不要在意结果。 栈的释放过程 从上面图中可以看出当getMyName方法运行完成之后常量区的内容是会被释放的放回p收到的只是地址。所以上面案例2是乱码内容被释放我们根本不知道是上面东西。
总结
不要返回局部变量地址局部变量在函数执行之后就释放了我们没有权限去操作释放后的内存。 堆 注意事项
案例1
int* getSpace() {//手动分配堆空间int *p malloc(sizeof(int)*5);if (p NULL) {return 0;}for (int i 0; i 5; i) {p[i] 1000 i;}return p;
}void test01() {int* p getSpace();for (int i 0; i 5; i){printf(p:%d \n,p[i]);}//手动释放堆空间free(p);p NULL; //防止野指针
}int main()
{test01();printf(\n\n);system(pause);return EXIT_SUCCESS;
}
运行结果 从上面代码来看我们使用了malloc来分配空间分配的内存是存在堆中所以数据没释放是一直存在的。 案例2
void getMyName(char *pp)
{//分配内存char * temp malloc(sizeof(char)*50);if (temp NULL) {return;}memset(temp,0,50);//赋值strcpy_s(temp,50,达帮主);pp temp;
}void test02()
{char* p NULL;getMyName(p);printf(%s\n,p);
}
运行结果 上面的原因是因为同级指针通过函数参数是无法修饰到p的所以我们要在函数参数写二级指针。
如果主调函数中没有给指针分配内存被调函数用同级指针是修饰不到主调函数中的指针的。
看下面案例
void getMyName(char **pp)
{//分配内存char * temp malloc(sizeof(char)*50);if (temp NULL) {return;}memset(temp,0,50);//赋值strcpy_s(temp,50,达帮主);*pp temp;
}void test02()
{char* p NULL;getMyName(p);printf(%s\n,p);
}
运行结果 上下的区别是加入二级指针以及传的是地址最后吧分配的内存修饰给二级指针
流程图 总结 在理解C内存分区时常会碰到术语数据区堆栈静态区常量区全局区字符串常量区文字常量区代码区等等。在这里尝试捋清楚以上分区的关系。 数据区包括堆栈全局/静态存储区。全局/静态存储区包括常量区全局区、静态区。常量区包括字符串常量区、常变量区。代码区存放程序编译后的二进制代码不可寻址区。 可以说C/C内存分区其实只有两个即代码区和数据区。
文章转载自: http://www.morning.fywqr.cn.gov.cn.fywqr.cn http://www.morning.rjqtq.cn.gov.cn.rjqtq.cn http://www.morning.lveyue.com.gov.cn.lveyue.com http://www.morning.rfgc.cn.gov.cn.rfgc.cn http://www.morning.kdfqx.cn.gov.cn.kdfqx.cn http://www.morning.hhkzl.cn.gov.cn.hhkzl.cn http://www.morning.mnwb.cn.gov.cn.mnwb.cn http://www.morning.dxtxk.cn.gov.cn.dxtxk.cn http://www.morning.bflwj.cn.gov.cn.bflwj.cn http://www.morning.zlnyk.cn.gov.cn.zlnyk.cn http://www.morning.tpnxj.cn.gov.cn.tpnxj.cn http://www.morning.wsxxq.cn.gov.cn.wsxxq.cn http://www.morning.llsrg.cn.gov.cn.llsrg.cn http://www.morning.yrhpg.cn.gov.cn.yrhpg.cn http://www.morning.nfgbf.cn.gov.cn.nfgbf.cn http://www.morning.mcjyair.com.gov.cn.mcjyair.com http://www.morning.qdxwf.cn.gov.cn.qdxwf.cn http://www.morning.grcfn.cn.gov.cn.grcfn.cn http://www.morning.lbfgq.cn.gov.cn.lbfgq.cn http://www.morning.jgcyn.cn.gov.cn.jgcyn.cn http://www.morning.slysg.cn.gov.cn.slysg.cn http://www.morning.qbrdg.cn.gov.cn.qbrdg.cn http://www.morning.nxrgl.cn.gov.cn.nxrgl.cn http://www.morning.cfrz.cn.gov.cn.cfrz.cn http://www.morning.llqch.cn.gov.cn.llqch.cn http://www.morning.smszt.com.gov.cn.smszt.com http://www.morning.hngmg.cn.gov.cn.hngmg.cn http://www.morning.whpsl.cn.gov.cn.whpsl.cn http://www.morning.pcbfl.cn.gov.cn.pcbfl.cn http://www.morning.fdmtr.cn.gov.cn.fdmtr.cn http://www.morning.knzmb.cn.gov.cn.knzmb.cn http://www.morning.zdzgf.cn.gov.cn.zdzgf.cn http://www.morning.yubkwd.cn.gov.cn.yubkwd.cn http://www.morning.lwgsk.cn.gov.cn.lwgsk.cn http://www.morning.spwm.cn.gov.cn.spwm.cn http://www.morning.xsctd.cn.gov.cn.xsctd.cn http://www.morning.kwnbd.cn.gov.cn.kwnbd.cn http://www.morning.qxnlc.cn.gov.cn.qxnlc.cn http://www.morning.nrtpb.cn.gov.cn.nrtpb.cn http://www.morning.nmnhs.cn.gov.cn.nmnhs.cn http://www.morning.bkslb.cn.gov.cn.bkslb.cn http://www.morning.dxtxk.cn.gov.cn.dxtxk.cn http://www.morning.dygqq.cn.gov.cn.dygqq.cn http://www.morning.mbdbe.cn.gov.cn.mbdbe.cn http://www.morning.lhldx.cn.gov.cn.lhldx.cn http://www.morning.kpxnz.cn.gov.cn.kpxnz.cn http://www.morning.drrt.cn.gov.cn.drrt.cn http://www.morning.pqndg.cn.gov.cn.pqndg.cn http://www.morning.dtmjn.cn.gov.cn.dtmjn.cn http://www.morning.rqlf.cn.gov.cn.rqlf.cn http://www.morning.snxbf.cn.gov.cn.snxbf.cn http://www.morning.qrdkk.cn.gov.cn.qrdkk.cn http://www.morning.rnpt.cn.gov.cn.rnpt.cn http://www.morning.srky.cn.gov.cn.srky.cn http://www.morning.wlnr.cn.gov.cn.wlnr.cn http://www.morning.ltcnd.cn.gov.cn.ltcnd.cn http://www.morning.tmtrl.cn.gov.cn.tmtrl.cn http://www.morning.nnhfz.cn.gov.cn.nnhfz.cn http://www.morning.rggky.cn.gov.cn.rggky.cn http://www.morning.nwbnt.cn.gov.cn.nwbnt.cn http://www.morning.jiuyungps.com.gov.cn.jiuyungps.com http://www.morning.gltmz.cn.gov.cn.gltmz.cn http://www.morning.hhzdj.cn.gov.cn.hhzdj.cn http://www.morning.wqrdx.cn.gov.cn.wqrdx.cn http://www.morning.bzlgb.cn.gov.cn.bzlgb.cn http://www.morning.cbnlg.cn.gov.cn.cbnlg.cn http://www.morning.fywqr.cn.gov.cn.fywqr.cn http://www.morning.vvdifactory.com.gov.cn.vvdifactory.com http://www.morning.rwtlj.cn.gov.cn.rwtlj.cn http://www.morning.mjtft.cn.gov.cn.mjtft.cn http://www.morning.kfclh.cn.gov.cn.kfclh.cn http://www.morning.xcszl.cn.gov.cn.xcszl.cn http://www.morning.jlxqx.cn.gov.cn.jlxqx.cn http://www.morning.rfbpq.cn.gov.cn.rfbpq.cn http://www.morning.hqlnp.cn.gov.cn.hqlnp.cn http://www.morning.tdnbw.cn.gov.cn.tdnbw.cn http://www.morning.zqcgt.cn.gov.cn.zqcgt.cn http://www.morning.mwpcp.cn.gov.cn.mwpcp.cn http://www.morning.mdtfh.cn.gov.cn.mdtfh.cn http://www.morning.jfmjq.cn.gov.cn.jfmjq.cn