C语言之数据在内存中的分配区域
来源:互联网 发布:淘宝网卖家注册流程 编辑:程序博客网 时间:2024/05/17 07:24
关于C代码中各个数据在内存中具体的存放区域,下面是APUE中所给出的信息
因本人是在是不懂在这画图,所以就借用vim弄了个不像样的东西,还是可以看懂的
------------ | | high address |----------| | stack | |----------| | | | | V | | | | | | ^ | | | | |----------| | heap | |----------| | | |----------|------------ | .rodata | |----------| | .bbs | Data area |----------| | .data | |----------|------------ | | low address |----------|
图中的储存环境是对于X86处理器上的Linux, 可以看出栈是从高地址向低地址方向增长, 堆是从低地址往高地址方向增长. 现在就介绍数据的存放.
1、栈(stack)的上面存放命令行参数和环境变量.
2、堆(heap)的下Data区
3、Data区下面是正文段(这是由CPU执行的机器指令部分)
一般数据就放在堆栈和Data区
stack区存放局部变量,只在程序运行时出现,空间由编译器自动分配和回收
heap区存放malloc分配的数据,只在程序运行时出现,空间一般由程序员分配和回收,如果有操作系统,而且程序没有free,操作系统可能在程序结束后收回内存
.radata (文字常量区), 存放常量和字符串都放在这里, 这里的数据不可更改,为只读数据
.bbs(未初始化静态变量区), 存放没有初始化的全局变量和静态变量, 不具有初值,在程序运行前不占储存器空间
.data(已初始化静态常量区) , 存放初始化的全局变量和静态常量,具有初值,程序运行前占储存器空间
一下是以为牛人给过的分析:
int a = 0; /* .data */static int b = 20; /* .data */char *p1; /* .bbs */const int A = 10; /* .rodata */int main (int argc, char **argv){ int b; /* stack*/ char s[] = "abc"; /* stack */ char *p2; /* stack */ static int c = 0; /* .data */ char *p3 = "12345"; /* p3 on stack, "12345" on .rodata */ p1 = (char *)malloc(10); /* the 10 and 20 bytes by malloc on stack */ p2 = (char *)malloc(20); strcpy(p1, "12345"); /* "12345" on .rodata */
- C语言之数据在内存中的分配区域
- C语言数据在内存中的存储
- c语言数组变量在内存中的连续分配情况
- 程序在内存中的数据区域
- 基础数据在内存中的存储-C语言
- C语言学习之基本类型在内存中的大小
- C语言--程序在内存中的分布
- C语言 程序在内存中的分布
- C语言在内存中的分布
- 变量在内存中的区域
- 代码在内存中的分配
- 对象在内存中的分配
- 程序在内存中的分配
- 进程在内存中的分配
- 类在内存中的分配
- 类在内存中的分配
- linux下C可执行文件在内存中的分配
- C语言 float和double型数据在内存中的存储方式
- python算法之——顺序查找
- 如何使用工具进行C/C++的内存泄漏检测
- java线程(一)
- Android - 文件读写操作 总结
- CDN流量放大攻击思路
- C语言之数据在内存中的分配区域
- SQLite 加密
- HMM学习小结
- 制作rpm包
- C#Windows窗体界面设计_04_添加PictureBox控件绘图
- 黑马程序员-----浅谈堆、栈和常量池
- 《C陷阱与缺陷》读书笔记
- lua栈 详解
- 求二元查找树的镜像