全局变量 使用gcc编译后,可以用size命令查看可执行程序的内存布局,其中“text”就是代码段,“data”就是已初始化数据段,“bss”就是未初始化数据段,“dec”是十进制下的程序总大小,“hex”是十六进制下的程序总大小。 我们为程序增加一个全局变量,且不初始化它。 //example.cstaticintglobal;/*一般来说,全局变...
在系统中,可执行文件(或者程序)最终只有放置在内存中才能运行的,程序的几个段,最终也会转化为内存中的几个区域。 在内存中,从地地址向高地址,依次是只读段、读写段、未初始化代码段、堆区域和栈区域。只读区域即文本段(Text)包含了代码段(Code)和只读数据段(RO data),在内存区域中。 映像文件中,将包含代码...
constint*constl_p_c = &i_l_c_var_h;/* 指向常量的常指针 */ int*l_var_aa = (int*)alloca(sizeof(int) *4);/* 从栈分配内存 */ staticint*i_s_l_var_p = &u_g_var_c; printf("---\n"); printf("栈区\n"); printf("%s\t\t%p\n", STR(l_var_aa), l_var_aa); prin...
用size命令来看代码的内存布局,下面看一个最简单的程序: #include<stdio.h>intmain(intargc,char*argv[]){printf("Hello world!\n");return0;} 下面编译并查看其分配内存大小 [root@node216 tmp]# gcc hello.c-o hello[root@node216 tmp]# size hello text data bss dec hex filename1156492161664680hello...
【C语言进阶剖析】40、程序的内存布局 4 程序术语的对应关系 1 什么是程序? 写完的 .c 文件是源文件。也叫源代码。 将源代码编译后,会生成可执行文件程序(Linux下是.out,windows下是.exe)。这个文件就是程序。也叫作可执行代码。 源代码与可执行文件的对应如下,也就是程序文件的布局:...
下面这段代码进一步说明C程序中各数据的内存布局: #include <stdio.h>#include<stdlib.h>inti1 =10;//静态全局区(data段)inti2;//静态全局区(bss段)staticinti3 =30;//静态全局区(data段)constinti4 =40;//代码区!!!voidfun(inti5)//栈区{inti6 =60;//栈区staticinti7 =70;//静态全局区(data...
可以通过readelf命令查看EFL文件的相关信息,例如 readelf -a a.out ,我们只关心各个段的分配情况,因此我们使用以下命令: # readelf -S a.out 将这里的内存布局与之前看到的程序的运行结果进行分析: &global_init_a=0x804a018 全局初始化:数据段 global_init_a=1 ...
1.C语言的内存布局。 C语言编译连接之后的可执行文件,分为: 1) 代码段(.text), 2) 只读数据段(.rodata), 3) 数据段(.data), 4) 堆 (heap), 5) 栈 (stack), 其中需要存储在文件里的只有前3个, 后2个在进程运行期间是动态变化的临时数据,并不需要存储在文件里。
作为计算机专业的来说,程序入门基本都是从C语言开始的,了解C程序中的内存布局,对我们了解整个程序运行,分析程序出错原因,会起到事半功倍的作用 。 C程序的内存布局包含五个段,分别是STACK(栈段),HEAP(堆段),BSS(以符号开头的块),DS(数据段)和TEXT(文本段)。