免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 10746 | 回复: 13

[C] 全局变量是否会自动初始化为0? [复制链接]

论坛徽章:
0
发表于 2010-07-30 10:51 |显示全部楼层
  1. int g_a;
  2. int g_b = 0;
  3. int g_c = 1;
  4. char* g_s = "hello";
  5. int main(int argc, char* argv[])
  6. {
  7.         int a;
  8.         char* s = "world";
  9.         static int s_a;
  10.         static int s_b = 0;
  11.         static int s_c = 1;
  12.         return 0;
  13. }
复制代码
符号表如下:
  1. 080495fc g     O .data  00000004              g_c
  2. 08049600 g     O .data  00000004              g_s
  3. 08049604 l     O .data  00000004              s_c.1188
  4. 08049608 g       *ABS*  00000000              __bss_start
  5. 08049608 g       *ABS*  00000000              _edata
  6. 0804960c l     O .bss   00000004              dtor_idx.5701
  7. 08049610 g     O .bss   00000004              g_b
  8. 08049614 l     O .bss   00000004              s_b.1187
  9. 08049618 l     O .bss   00000004              s_a.1186
  10. 0804961c g     O .bss   00000004              g_a
复制代码
可以看到g_a,g_b,s_a,s_b都在bss段,是否说明未初始化的全局变量一定会自动初始化为0,初始化为0的全局变量与未初始化是一样的,C标准有明确规定吗?

论坛徽章:
0
发表于 2010-07-30 10:52 |显示全部楼层
没有

论坛徽章:
323
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
发表于 2010-07-30 11:09 |显示全部楼层
是清0的

论坛徽章:
0
发表于 2010-07-30 11:11 |显示全部楼层
不放心 自己初始化就可以

论坛徽章:
0
发表于 2010-07-30 11:15 |显示全部楼层
是会的, 因为他们在.bss段中.

论坛徽章:
0
发表于 2010-07-30 12:24 |显示全部楼层
这算个节省文件空间的小技巧吧

论坛徽章:
0
发表于 2010-07-30 12:27 |显示全部楼层
会的,标准里没有?我觉得应该有吧

论坛徽章:
0
发表于 2010-07-31 10:44 |显示全部楼层

论坛徽章:
0
发表于 2010-07-31 11:51 |显示全部楼层
会的

论坛徽章:
0
发表于 2010-07-31 17:41 |显示全部楼层
可以看到g_a,g_b,s_a,s_b都在bss段,是否说明未初始化的全局变量一定会自动初始化为0,初始化为0的全局变量与未初始化是一样的,C标准有明确规定吗?tajial 发表于 2010-07-30 10:51


与C标准无关,这是系统行为。早期UNIX的第一原则是节省内存。它把外部(不应该叫全局)变量按未初始化和已初始化分别处理。在可执行文件里,前者不占空间(实际是占极少量空间,一个说明),后者占相应大小的空间。装载进内存时,两者都分配虚空间,但是对前者不分配实空间,而是全部映射到一个0页上。当代码对其做写操作时,才做实空间分配。这是早期的做法。后来兼顾时间,就有不同的做法。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP