windows和linux内存存储结构

本文详细解析了由C/C++编译的程序在Windows和Linux系统中内存的分配情况,包括栈区、堆区、全局区、文字常量区和程序代码区的位置与作用。

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

windows

一个由C/C++编译的程序占用的内存分为以下几个部分 
  1、栈区(stack)— 由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 
  2、堆区(heap)— 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。 
  3、全局区(静态区)(static)— 全局变量静态变量的存储是放在一块的,初始化的全局变量静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统释放。 
  4、文字常量区 — 常量字符串就是放在这里的。程序结束后由系统释放 
  5、程序代码区— 存放函数体的二进制代码

 

Linux

局部变量可以用类型相符的任意表达式来初始化,而全局变量只能用常量表达式初始化,例如:

例如,全局变量pi这样初始化是合法的:

double pi = 3.14 + 0.0016;

但这样初始化是不合法的:

double pi = acos(-1.0); 

局部变量这样初始化却是可以的。

 程序开始运行时要用适当的值来初始化全局变量,所以初始值必须保存在编译生成的可执行文件中,因此初始值在编译时就要计算出来,然而上面第二种初始化的值必须在程序运行时调用acos函数才能得到,所以不能用来初始化全局变量。请注意区分编译时和运行时这两个概念。为了简化编译器的C语言从语法上规定全局变量只能用常量表达式来初始化。

如果全局变量在定义时不初始化则初始值是0,如果局部变量在定义时不初始化则初始值是不确定的。

(高内存地址)

空洞

BSS段(未初始化数据段,用0填充)

.data数据段

.text文本段(低内存地址)

 

 

关于不同类型的变量在内存中的位置:

1.     全局变量 已初始化 位于.data数据段;未初始化 则位于.bss未初始化数据段。

2.     静态(static)全局变量也在.data数据段。

3.     局部变量 在栈上。静态局部变量,并不是在调用函数时分配,在函数返回时释放,而是像全局变量一样静态分配,在.data数据段,但它的作用域只在函数中起作用。

4.     const修饰的全局变量在.rodata只读数据段(const变量在定义时必须初始化,所以没有所谓的未初始化const变量),只读数据段在和.text同一个Segment.

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值