首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C语言编程程序的内存如何布局

4.未初始化数据段(BSS)   未初始化数据是在程序中声明,但是没有初始化的变量,这些变量在程序运行之前不需要占用存储器的空间。   ...在程序运行之前,将动态生成未初始化数据段(BSS),在程序的运行时还将 动态形成堆(Heap)区域和栈(Stack)区域。...则不会生成读写数据 区,而会定位为未初始化数据区(BSS)。...未初始化数据段(BSS)   与读写数据段类似,它也属于静态数据区,但是该段中的数据没有经过初始化。因此它只会在目标文件中被标识,而不会真正称为目标文件中的一段,该段将会在运行时产生。...未初始化数据段不设置后面的初始化数值,因此必须使用数值指定区域的大小,编绎器将根据大小设置BSS中需要增加的长度。

1.8K20

从一次字符串拼接失败说起

初始化 我们知道,对于已经初始化的全局和静态变量时存放在可执行文件的数据段(.data),对于未初始化的全局和静态变量,则在BSS段中。...从上述输出可知只有i、l在.data段,其它的在.bss段,还有一个比较有意思的点就是**.bss段的数据都被0进行初始化**,针对这两个问题: • t1 t2 t3 t4都调用了构造函数(有些是拷贝有些是默认构造函数...从可执行程序的角度来说,如果一个数据未被初始化,就不需要为其分配空间,所以.data 和.bss 的区别就是 .bss 并不占用可执行文件的大小,仅仅记录需要用多少空间来存储这些未初始化的数据,而不分配实际空间...也就是说.data和.bss段的数据,在main()函数执行之前就初始化完成,那么,可以得出的结论是这部分数据不存在多线程竞争的问题(main()函数执行前还不存在多线程现象)。...; int main() { std::cout << msg << std::endl; } • 指定初始化优先级(即顺序,以下实现仅限于gcc,msvc未做研究): // static_test.h

24010
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    c语言目标程序中的段

    2.只读数据段(RO Data) 只读数据段由程序中所使用的数据产生,该部分数据的特点是在运行中不需要改变,因此编译器会将该数据放入只读的部分中。C语言的一些语法将生成只读数据段。...4.未初始化数据段(BSS) 未初始化数据段常被称之为BSS(英文Block Start by Symbol的缩写)。与读写数据段类似,它也属于静态数据区,但是该段中的数据没有经过初始化。...C语言程序中的全局区(静态区),实际对应着下述几个段: · 只读数据段:RO Data · 读写数据段:RW Data · 未初始化数据段:BSS Data 一般来说,直接定义的全局变量在未初始化数据区...未初始化数据段,示例1中的bss_1[100]和bss_2[200]在程序中代表未初始化的数据段。其区别在于前者是全局的变量,在所有文件中都可以使用;后者是局部的变量,只在函数内部使用。...未初始化数据段不设置后面的初始化数值,因此必须使用数值指定区域的大小,编译器将根据大小设置BBS中需要增加的长度。

    1.4K30

    Linux虚拟地址空间布局

    用户进程部分分段存储内容如下表所示(按地址递减顺序): 名称 存储内容 栈 局部变量、函数参数、返回地址等 堆 动态分配的内存 BSS段 未初始化或初值为0的全局变量和静态局部变量 数据段 已初始化且初值非...由于程序加载时,BSS会被操作系统清零,所以未赋初值或初值为0的全局变量都在BSS中。BSS段仅为未初始化的静态分配变量预留位置,在目标文件中并不占据空间,这样可减少目标文件体积。...但程序运行时需为变量分配内存空间,故目标文件必须记录所有未初始化的静态分配变量大小总和(通过start_bss和end_bss地址写入机器代码)。...注意,尽管均放置于BSS段,但初值为0的全局变量是强符号,而未初始化的全局变量是弱符号。...某些编译器将未初始化的全局变量保存在common段,链接时再将其放入BSS段。在编译阶段可通过-fno-common选项来禁止将未初始化的全局变量放入common段。

    3.3K40

    【C++】面试基础重点知识

    (3G): 0×00000000到0×08048000此段不可访问/读写 指令在运行时存放在代码段/.text段 .rodata 只读数据段 .data 数据段 存放初始化或者初始化不为0的....bss 数据段 存放未初始化或者初始化为0的(内核会自动给该段数据清0) .heap 堆空间 .加载动态链接库*.dll *so stack 函数运行时栈空间 命令行参数和环境变量 此上为用户空间默认划分大小....data段 未初始化或初始化为0的都放在.bss段。...未初始化或者初始化为0 会存放在…bss段 注意:每一进程的用户空间是私有的,内核空间是共享的 函数调用堆栈的详细过程 #include // 求和函数 int sum(int...eax中 } //出右括号 底层指令:mov esp,ebp pop ebp ret //出栈操作,把出栈的内容放入CPU的PC寄存器里 举例: 在函数外边可以正常打印里面的返回值,因为

    10910

    一文领略链接与装载

    弱符号与强符号 符号分为弱符号与强符号,对于 C/C++ 来说,编译器默认函数和已初始化的全局变量为强符号,未初始化的全局变量为弱符号,可以使用__attribute__ ((weak))定义一个弱符号...BSS 段 BSS 段存放是的未初始化的局部静态变量,不同编译器实现可能有差异,所以主要是理解思想。...应该很容易想到,未初始化的局部静态变量之所以不占用磁盘是因为它们的默认值都为 0,既然都是 0 就没必要专门拿磁盘空间来存它们的值。...排除只会存在于栈中的局部变量、存在于只读数据段的常量,还有一种符号可能也会放入 BSS 段:未初始化的全局变量。...所以只有在链接器遍历完所有目标文件后才能确定这个符号的占用空间大小,那个时候再去为未初始化的全局变量在 BSS 段分配虚拟空间。 这么处理的直接原因是编译器允许符号重名。

    98831

    深入理解Linux C语言内存管理

    (3)未初始化数据区。亦称BSS区(uninitialized data segment),存入的是全局未初始化变量。BSS这个叫法是根据一个早期的汇编运算符而来,这个汇编运算符标志着一个块的开始。...BSS区的数据在程序开始执行之前被内核初始化为0或者空指针(NULL)。例如一个不在任何函数内的声明:   1 long sum[1000];   将变量sum存储到未初始化数据区。   ...如果是立即数(即具体的数值,如5),将直接包含在代码中;如果是局部数据,将在栈区分配空间,然后引用该数据地址;如果是BSS区和数据区,在代码中同样将引用该数据地址。   ...data段中的静态数据区存放的是程序中已初始化的全局变量、静态变量和常量。   (3)未初始化数据区(BSS)。在运行时改变其值。...由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余的那部分重新放入空闲链表中。

    2.8K10

    科普一下程序运行时内存分配

    在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等 数据段:储存已被初始化了的静态数据 数据段(data segment )通常是指用来存放程序中已初始化的全局变量的一块内存区域。...数据段属于静态内存分配。 BSS 段:未初始化的数据段. BSS 段(bss segment )通常是指用来存放程序中未初始化的全局变量的一块内存区域。...BSS 是英文Block Started by Symbol 的简称。BSS 段属于静态内存分配。...[ 注意:BSS段 和 data段的区别是 ,如果一个全局变量没有被初始化(或被初始化为0),那么他就存放在bss段;如果一个全局变量被初始化为非0,那么他就被存放在data段。]...false 因为mutablecopy啊,我们从官方文档定义出发(如下),mutableCopy会操作内存重新将数据复制出一份新的,因此内存地址不同,这也是为啥我们把mutableCopy称为深拷贝的原因

    1.7K30

    C++的内存布局

    1.3 未初始化数据区(又叫 bss 区)存入的是全局未初始化变量和未初始化静态变量。未初始化数据区的数据在程序开始执行之前被内核初始化为 0 或者空(NULL)。...然后,运行可执行程序,系统把程序加载到内存,除了根据可执行程序的信息分出代码区(text)、数据区(data)和未初始化数据区(bss)之外,还额外增加了栈区、堆区。...2.2 未初始化数据区(BSS)加载的是可执行文件BSS段,位置可以分开亦可以紧靠数据段,存储于数据段的数据(全局未初始化,静态未初始化数据)的生存周期为整个程序运行过程。...局部对象声明为静态之后,将改变它在内存中保存的位置,由动态数据—>静态数据,即从堆或栈变为数据段或bss段。全局对象声明为静态之后,而不会改变它在内存中保存的位置,仍然是在数据段或bss段。...它通常是共享的,多个实例之间共享文本段。文本段是不可修改的。初始化数据段:包含程序已经初始化的全局变量,.data。未初始化数据段:包含程序未初始化的全局变量,.bbs。

    381101

    嵌入式软件开发必知必会

    下面我们来简单归纳一下进程对应的内存空间中所包含的5种不同的数据区都是干什么的。 BSS段:BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。...BSS是英文Block Started by Symbol的简称。BSS段属于静态内存分配。 数据段:数据段(data segment)通常是指用来存放程序中已初始化的全局变量的一块内存区域。...全局的未初始化变量存在于.bss段中,具体体现为一个占位符;全局的已初始化变量存于.data段中;而函数内的自动变量都在栈上分配空间。....bss段(未手动初始化的数据)并不给该段的数据分配空间,只是记录数据所需空间的大小。data(已手动初始化的数据)段则为数据分配空间,数据保存在目标文件中。数据段包含经过初始化的全局变量以及它们的值。...接下来,我们来看一个例程,我将告诉你,在程序中上面所说的究竟在什么位置,请看代码: 1#include 2#include 3//位于BSS段,存放在程序组未初始化的内存区域

    97540

    浅谈text段、data段和bss段

    在采用段式内存管理的架构中(比如intel的80x86系统),bss段(Block Started by Symbol segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域,一般在初始化时...比如,在C语言程序编译完成之后,已初始化的全局变量保存在.data 段中,未初始化的全局变量保存在.bss 段中。 text段: 用于存放程序代码的区域, 编译时确定, 只读。...区别很明显,程序1位于bss段,程序2位于data段,两者的区别在于: 全局的未初始化变量存在于bss段中,具体体现为一个占位符,全局的已初始化变量存于data段中,而函数内的自动变量都在栈上分配空间。...注意: bss段(未手动初始化的数据)并不给该段的数据分配空间,只是记录数据所需空间的大小。 data段(已手动初始化的数据)为数据分配空间,数据保存在目标文件中。...data段包含经过初始化的全局变量以及它们的值。 BSS段的大小从可执行文件中得到,然后链接器得到这个大小的内存块,紧跟在数据段后面。

    2.5K11

    使用MCUXpresso IDE将数据、函数与文件存入指定位置

    在进行MCU开发时,根据实际需要,将数据、函数与文件存入指定位置,对合理使用存储器的十分重要。经常有客户问如何将某一数据、函数或文件存入指定的地址空间,结合客户的问题,本文主要对此进行讲解。...构建工程(Build)后,内存分配如以下console窗口所示: 其中.text,.data,.bss,.dec与Flash,RAM的关系如下所示: 自定义Flash与RAM分区 为了将某一数据、函数或文件存入指定的地址空间...例如: 初始化过的变量:uint16_t value1 = 1; 未初始化的数组:char data_buffer1[1024]; 常量数组: const char data_buffer2[1024]...2)将指定的变量与常量存入指定位置 将数组存入自定义的Flash与RAM中,需要调用C语言中的 __attribute__ ((section(#type#bank))) 例如 将数据放入Flash2的...$Flash2"))) + 数据声明 官方已封装并定义到cr_section_macros.h中,__DATA(RAM2)将可读写数组放入RAM2的.data段,__RODATA(Flash2)指将只读数组放入

    52420

    【答疑释惑第四十三讲】到底什么是可执行文件?

    可执行文件由一系列段(section)组成,text段用于存储代码,data段存储变量等数据,bss段用于存储未初始化的数据,比如int i就会存入bss段中,而char a = 'a' 这个变量就放入...data段了,另外还有堆(heap)和栈(stack)分别用于存放动态分配的内存,以及函数内部的变量等。...汇编语言现在的适用场景较少了,除了少数性能至关重要的地方外,嵌入式用的多一些,光学会汇编语言不懂其他高级语言应该是找不到工作的,应该这么说,学会高级语言是必选,汇编语言是景上添花,会的话对工作有帮助,不会的话...其实这是一个伪命题,软件可不是单单一个指令在计算机的CPU中执行那么简单,从编程本身来说,肯定是有着面向对象以及一大堆实用、方便的模板库的C++更方便,更强大,更快速,至于执行速度,现代C++的编译器编译出来的软件速度和...C语言编译出来的软件运行速度相差无几。

    89860

    【C 语言】内存管理 ( 动态内存分配 | 栈 | 堆 | 静态存储区 | 内存布局 | 野指针 )

    ( 2 ) 返回地址入栈 : 然后将 返回地址 放入栈中, 返回地址是 栈底地址 ; ( 3 ) ebp 指针入栈 : 将 old ebp 指针入栈, ebp 指针指向 old ebp 存放的地址...参数 放入栈中, 此时 main 函数 参数 在栈底 ; ( 2 ) 返回地址入栈 : 然后将 返回地址 放入栈中, 返回地址是 栈底地址 ; ( 3 ) ebp 指针入栈 : 将 old...) : 存放代码内容, 编译时就确定了, 只能读, 不能写 ; 2.数据段 ( .data section ) : 存放 已经初始化的 静态局部变量 和 全局变量, 编译阶段确定, 可读写 ; 3.BSS..., 严重会直接让系统故障 //4...., 或者***② 进行了初始化, 但是超出范围使用***; 1.结构体成员指针未初始化 : 结构体的成员中 如果有指针, 那么这个指针在使用时需要进行初始化, 结构体变量声明后, 其成员变量值是随机值,

    1.8K40

    浅析C++内存布局

    (注意:初始化为0的全局变量还是被保存在BSS段),static声明的变量也存储在数据段。 .bss bss段存储没有初值的全局变量或默认为0的全局变量,属于静态内存分配。 ...总结 1、执行文件中包含了text、rodata、data段的内容,不包含bss段内容(一堆0放入执行文件没有意义) 2、堆和栈的内存增长方向是相反的:栈是从高地址向低地址生长,堆是从低地址向高地址生长...子进程通过execve系统调用调用加载器,加载器删除现有的虚拟内存段,创建新的代码段数据段堆栈,新堆栈被初始化为0,通过将虚拟地址空间的页映射到可执行文件的页面大小chunk,新的代码段和数据段被初始化为可执行文件的内容...汇编第一阶段的代码主要可以分为以下部分:  设置异常向量表  设置特权管理模式  初始化PLL、DDR、MUX…  关MMU,关CACHE  判断代码在RAM还是FLASH,将FLASH代码复制至RAM...中  设置堆栈、清空bss段  跳转至C语言处进入第二阶段,第二段也属于bootloader的功能,完成一些硬件资源初始化。

    1.2K40

    一文读懂C语言中的存储类型

    变量 整个程序 整个程序运行期 初始化在data段,未初始化在BSS段 static全局变量 当前文件 整个程序运行期 初始化在data段,未初始化在BSS段 extern函数 整个程序 整个程序运行期...「未初始化数据区(BSS)」 加载的是可执行文件BSS段,位置可以分开亦可以紧靠数据段,存储于数据段的数据(全局未初始化,静态未初始化数据)的生存周期为整个程序运行过程。...「全局初始化数据区/静态数据区(data segment)」 加载的是可执行文件数据段,存储于数据段(全局初始化,静态初始化数据,文字常量(只读))的数据的生存周期为整个程序运行过程。...二、内存分区拓扑 内存数据存储 一、视图说明 程序在加载到内存前,代码区和全局区(data和bss)的大小就是固定的,程序运行期间不能改变。...然后,运行可执行程序,系统把程序加载到内存,除了根据可执行程序的信息分出代码区(text)、数据区(data)和未初始化数据区(bss)之外,还额外增加了栈区、堆区。

    1.1K10

    C语言内存讲解-详说内存分布和heap空间

    (text)、数据区(data)和未初始化数据区(bss)3 个部分(有些人直接把data和bss合起来叫做静态区或全局区)。...未初始化数据区(又叫 bss 区) 存入的是全局未初始化变量和未初始化静态变量。未初始化数据区的数据在程序开始执行之前被内核初始化为 0 或者空(NULL)。...然后,运行可执行程序,系统把程序加载到内存,除了根据可执行程序的信息分出代码区(text)、数据区(data)和未初始化数据区(bss)之外,还额外增加了栈区、堆区。...未初始化数据区(BSS) 加载的是可执行文件BSS段,位置可以分开亦可以紧靠数据段,存储于数据段的数据(全局未初始化,静态未初始化数据)的生存周期为整个程序运行过程。...数据段:只读数据段 .rodata段。初始化数据段 .data段。 未初始化数据段 .bss 段。  stack:栈。 在其之上开辟 栈帧。

    58730
    领券