C语言深度解析1-内存结构

对于C语言的学习首先要搞清楚C程序在内存中的分布。

提到内存大家都会头疼,我也不例外。但是为了根治这个疑难杂症,痛定思痛,纠结再纠结,蛋疼再蛋疼……

在查看了很多资料,终于对内存这东西有了进一步了的了解……

以下就是我的学习记录……如有错误请指正,大牛勿喷……文明看帖,努力回帖,共同进步……

废话不多说 Let‘s go……

1,在ceontos系统终端中


#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int add(int a, int b)
{
    return (a+b);
}

int a1 = 1;
static int a2 = 11;
const int a3 = 111;

int main()
{
    printf("pid:%p\n", getpid());//输出当前程序的进程ID
    int b1 = 2;
    static int b2 = 22;
    const int b3 = 222;
    
    int* p = malloc(sizeof(int));
    
    //以下输出变量和函数的地址
    printf("a1:%p\n", &a1);
    printf("a2:%p\n", &a2);
    printf("a3:%p\n", &a3);
    printf("b1:%p\n", &b1);
    printf("b2:%p\n", &b2);
    printf("b3:%p\n", &b3);
    printf("p:%p\n", p);
    printf("add:%p\n", add);
    printf("main:%p\n", main);
    
    while(1);
    //使这个函数一直运行
    //在linux下,cd /proc/进程ID/ 目录下,cat maps文件
    //此文件为此程序变量,函数映射到内存中信息
    //当程序返回时,进程ID这个目录就会自动删除,为查看maps文件中的信息
    //所以要确保程序不返回
    return 0;
}
2,编译add.c文件,并运行

,

3,查看这个程序的进程信息:cat /proc/进程ID/maps


上图就是每个变量,函数在内存中地址。

黄色代表代码区

add为函数

main为函数

a3为const全局变量


绿色代表全局区

a1为全局变量

a2为全局静态变量

b2局部静态变量


蓝色代表堆区

p1为malloc动态分配空间的地址


紫色代表栈区

b1为自动变量(局部变量)

b3为const的局部变量


4,从以上分析中可以得出:

一个C语言程序在内存空间中分为4个基本部分

(1)代码区

(2)全局区

(3)堆

(4)栈




评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值