免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 晓枫
打印 上一主题 下一主题

"A"=="A"为什么会不成立!!!? [复制链接]

论坛徽章:
0
31 [报告]
发表于 2004-09-26 13:18 |只看该作者

"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.
......

论坛徽章:
0
32 [报告]
发表于 2004-09-26 13:25 |只看该作者

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

[quote]原帖由 "mfmain"]这里我要强调的是常量字符串的地址是代码(text)段空间,而不是data段,更不是bss段,而text段一般是不允许进行写操作的,这也是不能够修改常量字符串中的内容的原因..........[/quote 发表:


实际的情况要比这复杂一些,常量字符串放在什么地方与采用的二进制文件格式以及编译器的实现都有关。

你是 bsd 用户,所以我假设你所说的是 elf 文件格式,可以吗? 如果你在 bsd 上写个小程序,用 gcc 编译一下,就会发现,常量字符串放在 .rodata 中。

移植到 windows 平台的 cygwin/gcc 采用windows 的 PE 文件格式,这种格式是从传统的 coff 衍生出来的。cygwin/gcc 的确把 常量字符串 放在  .text 中。

论坛徽章:
0
33 [报告]
发表于 2004-09-26 13:39 |只看该作者

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

首先谢谢版主(win_hate)的支持,不过版主所引用过来的文章,晓枫不敢保证会翻译准确,不知道我此文的理解是否正确,还请版主能给予指点。
上面是不是说,“不要指望所有的字符常量会存储在不同的地址。标准C允许实现为两个包含相同字符的字符常量使用相同的存储”我不知道这句理解的对不对。

论坛徽章:
0
34 [报告]
发表于 2004-09-26 15:05 |只看该作者

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

这样的讨论,路过,学过,千万不能错过。

论坛徽章:
0
35 [报告]
发表于 2004-09-26 16:10 |只看该作者

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

[quote]原帖由 "晓枫"]上面是不是说,“不要指望所有的字符常量会存储在不同的地址。标准C允许实现为两个包含相同字符的字符常量使用相同的存储”我不知道这句理解的对不对[/quote 发表:


是的。

编译器把两个一样的串放在同一个空间,是一种优化(参考前面 whyglinux 兄的贴子)。这种技术称为  "string pooling" ,在 vc 6 下,可以用 /Gf 参数打开。在gcc下,应该有类似的参数,但我没找到........gcc 的参数,实在是太多了!

论坛徽章:
0
36 [报告]
发表于 2004-09-26 18:33 |只看该作者

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

版主(win_hate)你的解释其实我能理解,可是我随后作了一个练习,反到把我给搞晕了,我发现同一字符串常量的地址或者说是相同字符串常量的地址时刻都在变化,这到底是为什么,是我理解错了,理解的不够深,还是我的练习有错误呢?请版主在指点一下小弟,让小弟在加深一下理解好吗!
下面是我练习时的一段程序代码和程序结果的截图。请帮小弟分析一下,小弟先谢过了!

main()
{
char *p;
/* char why[10];*/
char why[10]="world";
why[2]='R';
p=why;
p="world";
printf("%p,%p,%p,%p,%p\n",p,&p,why,"world","world";

printf("%p\n","world";
printf("%c\n","world"[2]);
printf("%p\n","world";
}
对上面的题还请所有感兴趣的朋友和大哥多多讨论,多多关注,小弟对于大家对此问题的关注非常感谢!也非常愿意与大家进行更多更深的交流。

why.GIF (3.04 KB, 下载次数: 11)

运行结果的载图

运行结果的载图

论坛徽章:
0
37 [报告]
发表于 2004-09-26 20:15 |只看该作者

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

zhe shi wo de

lj.JPG (6.17 KB, 下载次数: 11)

lj.JPG

论坛徽章:
0
38 [报告]
发表于 2004-09-26 20:16 |只看该作者

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

按这个图修改参数,然后试一试。

merge_string.JPG (58.19 KB, 下载次数: 14)

merge_string.JPG

论坛徽章:
0
39 [报告]
发表于 2004-09-26 20:20 |只看该作者

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

还有,把你测试代码中的

char why[10]="world";


去掉。

数组与字符串常量

p="world";


是完全不同的。暂时别把数组搅进来,否则你会更糊涂的。

论坛徽章:
0
40 [报告]
发表于 2004-09-26 20:30 |只看该作者

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

呵呵,谢谢版主的指点,我试过了,结果和ljttlf 的差不多,它们的地址都一样了,这是不是就是你们所指的merge,也就是前面有位朋友所说的强制选项的设置呢。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP