全局变量的内存布局

昨天学习了《门徒计划》课程里面的语言篇第5课 - 嵌入式 C 语言编译器,对里面的一个问题有点疑惑。
看以下代码:

#include <stdio.h>
#include "func.h"

int g_global = 0;
int g_test = 1;

int main(int argc, char *argv[])
{
    func();

    printf("&g_global = %p\n", &g_global);
    printf("&g_test = %p\n", &g_test);
    printf("&func = %p\n", &func);
    printf("&main = %p\n", &main);

    return 0;
}

问题是:g_global和g_test处于什么段里面?
之前学习C语言进阶剖析教程第40课 - 程序的内存布局,里面讲解了这个知识:
**(1).bss段存放的是未初始化的全局变量和静态变量;
(2).data段保存的是已经初始化了的全局变量和静态变量。**
那么g_global和g_test都已经被初始化了,那么都应该是在.data段。
实际上不是这样,在第5课中使用gcc生成映射文件的时候:
使用命令gcc -Wl,-Map=test.map test.c,生成的test.map文件里g_global是在.bss段不符合上面的知识点,g_test在.data段这是符合的!
今天在学习第6课 - 开发中的辅助工具中,使用到nm列出目标文件中的标识符(变量名,函数名),几乎同一样的代码g_global也是在.bss段。
问题出在哪里?g_global不是已经初始化为0了吗?
我的理解是:初始化为0和不初始化有什么不同呢?初始化为0就相当于没初始化,因为全局变量没初始化也是默认为0。这样g_global在.bss段就是合乎逻辑的。
如果说狄泰软件学院的四件套是教认怎么写代码,那么这个门徒课程就是教会学员怎么在代码出错,即产生问题的时候怎么样发现问题,解决问题。从表面上来看,就是看一线的开发人员使用了哪些工具,但是更重要的是学会怎么提高自己解决问题的能力。以敲代码来说,我的理解就是从汇编和内存布局方向入手。如果是写算法,那么就是从数学公式角度入手。两者都是相关的,都是从寻求事物的本质的角度看处理问题。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值