免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1697 | 回复: 9
打印 上一主题 下一主题

关于字符串 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-02-08 17:57 |只看该作者 |倒序浏览
for(int i = 0; i < 10; i ++)
printf("%d\n","string");

你会发现每次的地址是一样,
我本来以为每次会不同,现在有一个疑问,是不是每次输出一个常量字符串都会去检查这个字符串存在还是怎么之类的?

论坛徽章:
0
2 [报告]
发表于 2007-02-08 18:27 |只看该作者
反汇编一下看看

论坛徽章:
0
3 [报告]
发表于 2007-02-08 20:41 |只看该作者
LZ的意思是每次循环都会生成一个"string"?所以它们的地址不应该一样?

论坛徽章:
0
4 [报告]
发表于 2007-02-08 22:56 |只看该作者
当然一样了,因为"string"这个东西在编译连接完成后放在目标文件的.bss段中,运行时载入内存后就有了自己固定的地址,且在内存中只有一份拷贝。不会因为循环多次而改变。

论坛徽章:
0
5 [报告]
发表于 2007-02-08 23:03 |只看该作者
原帖由 marxn 于 2007-2-8 22:56 发表
当然一样了,因为"string"这个东西在编译连接完成后放在目标文件的.bss段中,运行时载入内存后就有了自己固定的地址,且在内存中只有一份拷贝。不会因为循环多次而改变。


我得到的结果是这个字符串放在 .text 段

NetBSD/i386

--

论坛徽章:
0
6 [报告]
发表于 2007-02-08 23:19 |只看该作者
参考一下这个老帖子:


["A"=="A"为什么会不成立!!!? ]  

其中有一段再引一下:

原帖由 "C A Reference Manual" 发表:

2.7.4 String Constants
......
Do not depend on all string constants being stored at different addresses. Standard C allows implementations to use the same storage for two string constants that contain the same characters.
......

[ 本帖最后由 win_hate 于 2007-2-8 23:23 编辑 ]

论坛徽章:
0
7 [报告]
发表于 2007-02-09 01:38 |只看该作者
先谢谢楼上几位!
就是每次打印一个常量字符串!

论坛徽章:
0
8 [报告]
发表于 2007-02-09 08:46 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
9 [报告]
发表于 2007-02-09 10:05 |只看该作者
字面字符串常量(literal string constant) 通常会被放在 .text 或其他静态只读区域。上文提到的 "A" != "A" 的原因在于,C/C++ 的编译器不会去做全局分析;当不同编译单元中出现相同的字符串常量时,每个对象文件都可能包含一个副本,链接器也不会尝试合并,所以来自不同编译单元的字符串常量可能具有不同的地址。

论坛徽章:
0
10 [报告]
发表于 2007-02-09 20:53 |只看该作者
>>  就是每次打印一个常量字符串!

首先应该清楚的是:字符串时一个数组对象,在程序中此数组对象转换为其首元素的地址,所以打印的是字符串中第一个字符的地址,而不是这个字符串对象本身。

其次,关于字符串字面量是否常量的问题请参考随后的贴子。

>> 你会发现每次的地址是一样

这是因为字符串是一个静态对象,而静态对象的地址是一个常量。

关于 C/C++ 中的对象按照其生存期的特点进行的分类,可参考我在下面贴子中的说明:
http://bbs.chinaunix.net/viewthread.php?tid=883348
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP