C语言之数据在内存中的分配区域

本文详细介绍了C语言程序在内存中的布局方式,包括栈、堆、数据段等不同区域的作用及存储内容。解释了栈从高地址向低地址增长而堆相反的特点,并列举了各类变量的存放位置。

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

关于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 */


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值