c的分段存储布局

本文介绍了C语言的分段存储布局,包括代码段(只读,用于存放指令)、初始化数据段(.data,存储已初始化全局变量和静态变量)、非初始化数据段(.bss,用于未初始化全局变量和静态变量,程序启动时内核初始化为0或NULL)、栈(存放函数内变量和调用信息,随函数结束而销毁)以及堆(用户动态申请的内存空间)。同时提到了.rodata段用于存储复杂常量,并讨论了X86体系结构下的经典内存安排。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

c的分段存储布局

  • 代码段

    代码段又称为指令段,是CUP执行的指令部分

    代码段通常是只读的,但也有特殊情况。由于代码段不可改的性质使得它可以供多个程序共享使用

    当我们试图修改代码段的信息时,就会产生段错误(Segmentation fault)。

    对于一些简单的常量,比如整型,随着指令一起存储。

  • 初始化数据段(.data)

    程序中明确给定初值的全局变量和静态变量

    初始化数据段在编译的时候就明确了该段的大小,在程序运行的时候该段的大小不会发生改变

  • 非初始化数据段(.bss)

    程序中没有明确给定初值的全局变量和静态变量

    这个段的内容往往不会保存在外存上,但是会标记未初始化变量大小、属性等信息的开销。程序开始运行时,内核一般会将这些变量初始化为0或者NULL。

    通过实验可以看出.bbs段和.data段的大小为0。

    有趣的是当对全局或静态变量赋值为0或者NULL时,编译器会做和未赋值一样的操作

  • 所有的函数内声明的变量及函数调用时所需要保存的信息(返回地址,函数调用前各个寄存器的值等)

    栈内的变量的作用域往往只在函数内,其生命期是随着函数调用的结束而结束,在写C语言时要注意不要将一个指向局部变量的指针作为函数的返回值返回。

  • 用户申请的内存空间

  • .rodata段

    复杂常量,比如字面量

    其存储的首地址转换成一个简单变量随着指令存储

X86体系结构下这些段的经典安排方式(在虚拟存储器上)



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值