设为首页 加入收藏

TOP

C语言 内存布局(一)
2023-09-23 15:43:31 】 浏览:577
Tags:语言

GCC编译

预处理->编译->汇编->链接

预处理:头?件包含、宏替换、条件编译、删除注释...
编译:主要进?词法、语法、语义分析等,检查?误后将预处理好的?件编译成汇编?件...
汇编:将汇编?件转换成 ?进制?标?件...
链接:将项?中的各个?进制?件+所需的库+启动代码链接成可执??件...

内存布局

当我们运行程序时,可加载到 RAM 中。如下是一个内存布局图。
image

示例代码

/* memory layout test */
/* #define STR(s) #s */
static int u_s_g_var_a; /* 未初始化静态全局变量a 存放在bss段 */
static int i_s_g_var_b = 10; /* 已初始化静态全局变量b 存在在data段 */

int u_g_var_c; /* 未初始化全局变量c */
int i_g_var_d = 10; /* 已初始化全局变量d */

const int u_g_c_var_e; /* const 修饰未初始化全局常量 */
const int i_g_c_var_f = 10; /* const 修饰初始化全局常量 */

void func_test(void)
{
    printf("func\n");
}

int memory_layout_test(void)
{
    int l_var_a;
    int l_var_b = 10;
    int *l_var_c = NULL;
    int *l_var_d = NULL;
    static int u_s_l_var_e;
    static int i_s_l_var_f = 10;
    const int u_l_c_var_g;
    const int i_l_c_var_h = 10;
    char *l_var_s = "Hello World";
    char l_var_arr[] = "Hello World";
    const int *l_p_a =  &l_var_a;   /* 常量指针 */
    int * const l_p_b = &l_var_b;       /* 指针常量 */
    const int * const l_p_c =  &i_l_c_var_h;    /* 指向常量的常指针 */
    int *l_var_aa = (int *)alloca(sizeof(int) * 4); /* 从栈分配内存 */

    printf("-----------------------------------------------------\n");
    printf("栈区\n");
    printf("%s\t\t%p\n", STR(l_var_aa), l_var_aa);
    printf("%s\t\t\t%p\n", STR(l_var_a), &l_var_a);
    printf("%s\t\t\t%p\n", STR(l_var_b), &l_var_b);
    printf("%s\t\t%p\n", STR(&l_var_c), &l_var_c);
    printf("%s\t\t%p\n", STR(&l_var_d), &l_var_d);
    printf("%s\t\t%p\n", STR(u_l_c_var_g), &u_l_c_var_g);
    printf("%s\t\t%p\n", STR(i_l_c_var_h), &i_l_c_var_h);
    printf("%s\t\t%p\n", STR(&l_var_s), &l_var_s);
    printf("%s\t\t\t%p\n", STR(&l_p_a), &l_p_a);
    printf("%s\t\t\t%p\n", STR(&l_p_b), &l_p_b);
    printf("%s\t\t\t%p\n", STR(&l_p_c), &l_p_c);
    printf("%s\t\t%p\n", STR(l_var_arr), l_var_arr);


    l_var_c = (int *)malloc(sizeof(int) * 4);
    l_var_d = (int *)malloc(sizeof(int) * 4);
    printf("-----------------------------------------------------\n");
    printf("堆区\n");
    printf("%s\t\t\t%p\n", STR(l_var_c), l_var_c);
    printf("%s\t\t\t%p\n", STR(l_var_d), l_var_d);

    printf("-----------------------------------------------------\n");
    printf("bss区\n");
    printf("%s\t\t%p\n", STR(u_s_g_var_a), &u_s_g_var_a);
    printf("%s\t\t%p\n", STR(u_g_var_c), &u_g_var_c);
    printf("%s\t\t%p\n", STR(u_s_l_var_e), &u_s_l_var_e);
    printf("%s\t\t%p\n", STR(u_g_c_var_e), &u_g_c_var_e);

    printf("-----------------------------------------------------\n");
    printf("data区\n");
    printf("%s\t\t%p\n", STR(i_s_g_var_b), &i_s_g_var_b);
    printf("%s\t\t%p\n", STR(i_g_var_d), &i_g_var_d);
    printf("%s\t\t%p\n", STR(i_s_l_var_f), &i_s_l_var_f);

    printf("-----------------------------------------------------\n");
    printf("text区\n");
    printf("常量\n");
    printf("%s\t\t%p\n", STR(i_g_c_var_f), &i_g_c_var_f);
    printf("%s\t\t\t%p\n", STR(l_var
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Programming abstractions in C阅.. 下一篇最全的李慧芹APUE-标准IO笔记

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目