C语言 内存布局

打印 上一主题 下一主题

主题 892|帖子 892|积分 2676

GCC编译

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

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

示例代码
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "utils.h"
  4. /* memory layout test */
  5. /* #define STR(s) #s */
  6. static int u_s_g_var_a; /* 未初始化静态全局变量a 存放在bss段 */
  7. static int i_s_g_var_b = 10; /* 已初始化静态全局变量b 存在在data段 */
  8. static int *u_s_g_var_p;
  9. static int *i_s_g_val_p = &u_s_g_var_a;
  10. int u_g_var_c; /* 未初始化全局变量c */
  11. int i_g_var_d = 10; /* 已初始化全局变量d */
  12. const int u_g_c_var_e; /* const 修饰未初始化全局常量 */
  13. const int i_g_c_var_f = 10; /* const 修饰初始化全局常量 */
  14. void func_test(void)
  15. {
  16.     printf("func\n");
  17. }
  18. int test_memory_layout(void)
  19. {
  20.     int l_var_a;
  21.     int l_var_b = 10;
  22.     int *l_var_c = NULL;
  23.     int *l_var_d = NULL;
  24.     static int u_s_l_var_e;
  25.     static int i_s_l_var_f = 10;
  26.     const int u_l_c_var_g;
  27.     const int i_l_c_var_h = 10;
  28.     char *l_var_s = "Hello World";
  29.     char l_var_arr[] = "Hello World";
  30.     const int *l_p_a =  &l_var_a;   /* 常量指针 */
  31.     int * const l_p_b = &l_var_b;       /* 指针常量 */
  32.     const int * const l_p_c =  &i_l_c_var_h;    /* 指向常量的常指针 */
  33.     int *l_var_aa = (int *)alloca(sizeof(int) * 4); /* 从栈分配内存 */
  34.                 static int *i_s_l_var_p = &u_g_var_c;
  35.     printf("-----------------------------------------------------\n");
  36.     printf("栈区\n");
  37.     printf("%s\t\t%p\n", STR(l_var_aa), l_var_aa);
  38.     printf("%s\t\t\t%p\n", STR(l_var_a), &l_var_a);
  39.     printf("%s\t\t\t%p\n", STR(l_var_b), &l_var_b);
  40.     printf("%s\t\t%p\n", STR(&l_var_c), &l_var_c);
  41.     printf("%s\t\t%p\n", STR(&l_var_d), &l_var_d);
  42.     printf("%s\t\t%p\n", STR(u_l_c_var_g), &u_l_c_var_g);
  43.     printf("%s\t\t%p\n", STR(i_l_c_var_h), &i_l_c_var_h);
  44.     printf("%s\t\t%p\n", STR(&l_var_s), &l_var_s);
  45.     printf("%s\t\t\t%p\n", STR(&l_p_a), &l_p_a);
  46.     printf("%s\t\t\t%p\n", STR(&l_p_b), &l_p_b);
  47.     printf("%s\t\t\t%p\n", STR(&l_p_c), &l_p_c);
  48.     printf("%s\t\t%p\n", STR(l_var_arr), l_var_arr);
  49.     l_var_c = (int *)malloc(sizeof(int) * 4);
  50.     l_var_d = (int *)malloc(sizeof(int) * 4);
  51.     printf("-----------------------------------------------------\n");
  52.     printf("堆区\n");
  53.     printf("%s\t\t\t%p\n", STR(l_var_c), l_var_c);
  54.     printf("%s\t\t\t%p\n", STR(l_var_d), l_var_d);
  55.     printf("-----------------------------------------------------\n");
  56.     printf("bss区\n");
  57.     printf("%s\t\t%p\n", STR(u_s_g_var_a), &u_s_g_var_a);
  58.     printf("%s\t\t%p\n", STR(u_g_var_c), &u_g_var_c);
  59.     printf("%s\t\t%p\n", STR(u_s_l_var_e), &u_s_l_var_e);
  60.     printf("%s\t\t%p\n", STR(u_g_c_var_e), &u_g_c_var_e);
  61.     printf("%s\t\t%p\n", STR(&i_s_l_var_p), &i_s_l_var_p);
  62.     printf("%s\t\t%p\n", STR(&u_s_g_var_p), &u_s_g_var_p);
  63.     printf("%s\t\t%p\n", STR(&i_s_g_val_p), &i_s_g_val_p);
  64.     printf("-----------------------------------------------------\n");
  65.     printf("data区\n");
  66.     printf("%s\t\t%p\n", STR(i_s_g_var_b), &i_s_g_var_b);
  67.     printf("%s\t\t%p\n", STR(i_g_var_d), &i_g_var_d);
  68.     printf("%s\t\t%p\n", STR(i_s_l_var_f), &i_s_l_var_f);
  69.     printf("-----------------------------------------------------\n");
  70.     printf("text区\n");
  71.     printf("常量\n");
  72.     printf("%s\t\t%p\n", STR(i_g_c_var_f), &i_g_c_var_f);
  73.     printf("%s\t\t\t%p\n", STR(l_var_s), l_var_s);
  74.     printf("代码\n");
  75.     printf("%s\t%p\n", STR(memory_layout_test), memory_layout_test);
  76.     printf("%s\t\t%p\n", STR(func_test), func_test);
  77.     free(l_var_c);
  78.     l_var_c = NULL;
  79.     free(l_var_d);
  80.     l_var_d = NULL;
  81.     return 0;
  82. }
  83. void main_test(void)
  84. {
  85.     printf("TEST ENTRY\n");
  86.     printf("GNU libc version: %s\n", gnu_get_libc_version());
  87.     memory_layout_test();
  88. }
复制代码
运行结果:
  1. -----------------------------------------------------
  2. 栈区
  3. l_var_aa                0xffcc5760
  4. l_var_a                 0xffcc5784
  5. l_var_b                 0xffcc5788
  6. &l_var_c                0xffcc578c
  7. &l_var_d                0xffcc5790
  8. u_l_c_var_g             0xffcc5794
  9. i_l_c_var_h             0xffcc5798
  10. &l_var_s                0xffcc579c
  11. &l_p_a                  0xffcc57a0
  12. &l_p_b                  0xffcc57a4
  13. &l_p_c                  0xffcc57a8
  14. l_var_arr               0xffcc57b0
  15. -----------------------------------------------------
  16. 堆区
  17. l_var_c                 0x57f895b0
  18. l_var_d                 0x57f895d0
  19. -----------------------------------------------------
  20. bss区
  21. u_s_g_var_a             0x565d0050
  22. u_g_var_c               0x565d004c
  23. u_s_l_var_e             0x565d0058
  24. u_g_c_var_e             0x565cca08
  25. i_s_l_var_p             0x565d004c
  26. &i_s_l_var_p            0x565d001c
  27. &u_s_g_var_p            0x565d0054
  28. &i_s_g_val_p            0x565d0018
  29. -----------------------------------------------------
  30. data区
  31. i_s_g_var_b             0x565d000c
  32. i_g_var_d               0x565d0010
  33. i_s_l_var_f             0x565d0014
  34. -----------------------------------------------------
  35. text区
  36. 常量
  37. i_g_c_var_f             0x565cca0c
  38. l_var_s                 0x565cca15
  39. 代码
  40. test_memory_layout      0x565c9b5e
  41. func_test               0x565c9b33
复制代码
参考链接:

https://en.wikipedia.org/wiki/Data_segment
https://en.wikipedia.org/wiki/Memory_segmentation
https://medium.com/@vikasv210/memory-layout-in-c-fe4dffdaeed6
https://github.com/gatieme/AderXCoding/tree/master/language/c/memory_layout

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

欢乐狗

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表