C程序的存储空间布局


一、C程序在内存空间的组成部分

1.正文段

CPU执行的机器指令部分,因为他是共享的,所以在内存中一般只需存在一个副本。(只读)

2.初始化数据段(静态存储区域)

任何在函数之外声明的已赋值的变量。(比如已赋值的全局变量)

int a=0;

3.非初始化数据段(静态存储区域)

任何在函数之外声明的尚未赋值的变量。(比如未赋值的全局变量)

int a;

4.栈

栈一般是由编译器自动分配和释放的,运行效率很高,但内存容量有限。一般包括执行函数时的局部变量、每次函数调用时所需保存的信息。(比如main函数里的局部变量)

5.堆

堆中一般进行动态内存分配,需要手动申请和释放,较为灵活,用完必须释放,否则会导致内存泄漏、段错误等。例如:malloc、free等函数申请的动态内存。

二、图示

在这里插入图片描述

三、实例

代码如下(示例):

#include <stdio.h>
#include <malloc.h>
int main(void)
{
    /*在栈上分配*/
    int  i1=0;
    int  i2=0;
    int  i3=0;
    int  i4=0;
    printf("栈:向下\n");
    printf("i1=0x%08x\n",&i1);
    printf("i2=0x%08x\n",&i2);
    printf("i3=0x%08x\n",&i3);
    printf("i4=0x%08x\n\n",&i4);
     printf("--------------------\n\n");
    /*在堆上分配*/
    char  *p1 = (char *)malloc(4);
    char  *p2 = (char *)malloc(4);
    char  *p3 = (char *)malloc(4);
    char  *p4 = (char *)malloc(4);
    printf("p1=0x%08x\n",p1);
    printf("p2=0x%08x\n",p2);
    printf("p3=0x%08x\n",p3);
    printf("p4=0x%08x\n",p4);
    printf("堆:向上\n\n");
    /*释放堆内存*/
    free(p1);
    p1=NULL;
    free(p2);
    p2=NULL;
    free(p3);
    p3=NULL;
    free(p4);
    p4=NULL;
    return 0;
}

该示例代码主要演示了在内存分配中的堆和栈的区别,其运行结果为:

栈:向下
i1=0x0060fefc
i2=0x0060fef8
i3=0x0060fef4
i4=0x0060fef0


p1=0x00bd14e0
p2=0x00bd3148
p3=0x00bd3158
p4=0x00bd3168
堆:向上


引用

Richardstevens W , Rago S , 拉戈, et al. UNIX环境高级编程[M]. 人民邮电出版社, 2014.
(作者未知)http://c.biancheng.net/c/stack/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值