我是靠谱客的博主 欢呼火,最近开发中收集的这篇文章主要介绍C程序的存储空间布局一、C程序在内存空间的组成部分二、图示三、实例,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

C程序的存储空间布局

  • 一、C程序在内存空间的组成部分
    • 1.正文段
    • 2.初始化数据段(静态存储区域)
    • 3.非初始化数据段(静态存储区域)
    • 4.栈
    • 5.堆
  • 二、图示
  • 三、实例


一、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%08xn",&i1);
    printf("i2=0x%08xn",&i2);
    printf("i3=0x%08xn",&i3);
    printf("i4=0x%08xnn",&i4);
     printf("--------------------nn");
    /*在堆上分配*/
    char  *p1 = (char *)malloc(4);
    char  *p2 = (char *)malloc(4);
    char  *p3 = (char *)malloc(4);
    char  *p4 = (char *)malloc(4);
    printf("p1=0x%08xn",p1);
    printf("p2=0x%08xn",p2);
    printf("p3=0x%08xn",p3);
    printf("p4=0x%08xn",p4);
    printf("堆:向上nn");
    /*释放堆内存*/
    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/

最后

以上就是欢呼火为你收集整理的C程序的存储空间布局一、C程序在内存空间的组成部分二、图示三、实例的全部内容,希望文章能够帮你解决C程序的存储空间布局一、C程序在内存空间的组成部分二、图示三、实例所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(38)

评论列表共有 0 条评论

立即
投稿
返回
顶部