免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6555 | 回复: 3

[C] C语言中字符串字面值、const全局变量、const局部变量保存在哪个段?? [复制链接]

论坛徽章:
0
发表于 2013-08-08 15:15 |显示全部楼层

当我们用size命令查看目标文件时,会出现三个段,分别为.text、.data、.bss。这三个段分别存放的内容如下:
.text:保存CPU执行的指令
.data:保存初始化的全局变量和静态局部变量
.bss:保存未初始化的全局变量和静态局部变量

请问:
(1)网上查找资料,说字符串字面值存在.rodata段中,也有说存放在.data段中?哪个正确呢?是不是随着编译器的实现不同而不同呢?
(2)const全局变量和const局部变量(由于const变量定义时肯定要初始化,所以不分初始化和未初始化),请问它们各自保存在哪里呢?
(3)我看网上有人说文本段?那这个文本段是不是就是指的.text段,也就是说的code段??

请哪位前辈知道,帮忙解答下,一直没彻底搞明白上面三个问题。

在此,表示感谢。

论坛徽章:
17
处女座
日期:2013-08-27 09:59:352015亚冠之柏太阳神
日期:2015-07-30 10:16:402015亚冠之萨济拖拉机
日期:2015-07-29 18:58:182015年亚洲杯之巴勒斯坦
日期:2015-03-06 17:38:17摩羯座
日期:2014-12-11 21:31:34戌狗
日期:2014-07-20 20:57:32子鼠
日期:2014-05-15 16:25:21亥猪
日期:2014-02-11 17:32:05丑牛
日期:2014-01-20 15:45:51丑牛
日期:2013-10-22 11:12:56双子座
日期:2013-10-18 16:28:17白羊座
日期:2013-10-18 10:50:45
发表于 2013-08-08 16:17 |显示全部楼层
回复 1# 梦醒潇湘love


    .text、.data、.bss, rodata这些段都是预定义的段,其实有些程序远不止这些段,没有什么规定强制生成的程序一定要用什么样的段名,真正起作用的是具体段的属性,比如说ELF格式的程序rodata通常有SHT_PROGBITS属性,编程器和链接器完全可以不使用任务预定义的段,完全使用自定义的段名,只需要要生成相应可执行文件的时候指定相应的属性就可以起到相同的目的。最典型的情况比如C++,通都会有额外的段去处理编译器生成的stub代码。通常的编译器和链接器会把字符字面量和常量放在rodata段中(记住,不是必需的)。编译器甚至提供方法让开发人员去创建指定的段。文本段指的就是text段。由于没有硬性规定,所以你的问题在具体的系统和编译器下去分析。

论坛徽章:
0
发表于 2016-09-03 15:55 |显示全部楼层
谢谢楼上的解答

论坛徽章:
1
双子座
日期:2013-11-06 17:18:01
发表于 2016-09-06 17:21 |显示全部楼层
void foo(void)
{
char  AA[] = "hello";

}
LZ觉得 "hello"字串该放哪? 可以放.rodata区,也可以直接在栈上用指令赋值,此情况字符串就不用保存在.rodata区。
具体看编译器怎么实现了。没有谁规定
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP