| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1354 人关注过本帖
标题:学C之初的一个问题 关于字符串的 请教各位高手·。。
只看楼主 加入收藏
mandown1991
Rank: 4
等 级:业余侠客
帖 子:262
专家分:252
注 册:2011-3-2
收藏
得分:2 
还没学到,不过在这里先学习一下!
2011-03-02 23:27
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:12 
标准里对编译器的实现几乎没有限制。这个问题或者只从标准的角度出发看,或者就是从实践的角度去看。差别非常大。

刚刚没仔细看楼主 7 楼说的。看了之后确实发现楼主对标准的作用有一定的誤解。我明天出点标准的原文,可能能使楼主在很大程度上加深对“标准是什么”这个问题的理解~


[ 本帖最后由 pangding 于 2011-3-2 23:31 编辑 ]
2011-03-02 23:27
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
以下是引用卧龙孔明在2011-3-2 23:23:55的发言:

非常建议楼主好好看书,如果你现在确实认真看了,那么建议你换一本书。
现在我来解释你这个问题:
首先,你要明白char *a = "ASDFGHJ";倒地是什么意思。
"ASDFGHJ"是一个常量,a指向这个常量。
验证a指向的是常量的方法:你试试a[0] = 1 可用否?程序崩溃了吧。
现在解释第一个问题,a,b都是指向了"ASDFGHJ"的字符指针,为什么a,b相同?因为你代码中a=,b=后的字符串是同一个字符串,编译器做了处理。
你可以做另外一个实验,让a=,b=后的字符串不相同,那么你会发现它们的地址是不同的。
而"BCCN" == "BCCN"中你所比较的,是两个常量字符串的地址,由之前所述,这两个常量字符串地址是相同的(好比1=1),所以输出了=。
最后,输出地址请用%p。
为楼主实践精神所感写下这些,希望对楼主有帮助。
ps: 现在的C语言教材水平参差不齐,大多数教材错误或不符合标准的内容不计其数,一些作者真是混蛋。

牛人回复了。。

您讲的这些我明白了 最后,输出地址请用%p。 这个是很好的建议

不过 我觉得您没说到点子上 虽然您解释的很详细 但与我的疑问不搭边。。
2011-03-02 23:32
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
以下是引用pangding在2011-3-2 23:27:57的发言:

标准里对编译器的实现几乎没有限制。这个问题或者只从标准的角度出发看,或者就是从实践的角度去看。差别非常大。

刚刚没仔细看楼主 7 楼说的。看了之后确实发现楼主对标准的作用有一定的誤解。我明天出点标准的原文,可能能使楼主在很大程度上加深对“标准是什么”这个问题的理解~

我觉得您理解我这个问题很到位

希望能发标准看看 这样给您的分是很可观的哦。。

我貌似有标准来着 找不到了 懒得找了。。


2011-03-02 23:35
卧龙孔明
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:59
帖 子:3872
专家分:684
注 册:2006-10-13
收藏
得分:0 
以下是引用zklhp在2011-3-2 23:32:36的发言:


牛人回复了。。

您讲的这些我明白了 最后,输出地址请用%p。 这个是很好的建议

不过 我觉得您没说到点子上 虽然您解释的很详细 但与我的疑问不搭边。。


许多人对我说的那个问题有错误的理解从而导致这类错误认识,可能是我没有理解你的疑问。
再深的东西我不清楚了,你去找c99标准(500多页的pdf文档)看看,网上能搜到。

My Blog: www.aiexp.info
虽然我的路是从这里开始的,但是这里不再是乐土.感谢曾经影响过,引导过,帮助过我的董凯,飞燕,leeco,starwing,Rockcarry,soft_wind等等等等.别了,BCCN.
2011-03-02 23:43
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
还有 骂作者的言论恕我不敢苟同。。

有时候我也觉得真XX 但回过头来想想 编一本书 哪怕是翻译 也挺不容易的 任何时候 这其中的功劳是不能抹杀的

那种故意出垃圾书的作者毕竟是少数罢。。。

而且 垃圾书自然由市场来淘汰 骂 不解决问题 口舌之快罢了 说不好听 泼妇骂街耳

得罪见谅。。
2011-03-02 23:44
pcbaichi
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
帖 子:486
专家分:1185
注 册:2010-11-13
收藏
得分:3 
回复 16楼 zklhp
楼主这样说是有道理,但lz肯定是没有那种深刻体会,否则我也不会来发表意见,孔明大牛说的真的没错

免费赠送河蟹一只
2011-03-03 00:09
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
收藏
得分:10 
这个就要看编译器会不会优化了
我记得之前arm嵌入式的编译器会优化,但是VC不会优化

~~~~~~~~~~~~~~~好好学习~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2011-03-03 00:24
你们都要疼我哦
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:火星
等 级:贵宾
威 望:49
帖 子:1296
专家分:2746
注 册:2008-7-13
收藏
得分:14 
zklhp开始学C了

那个是编译器的事。和C标准应该没什么关系。
VC编译器是把ASDFGHJ作为一个常量保存在.rdata节中。
装入内存时做为局部变量传入地址。


LEA EDI,DWORD PTR SS:[EBP-D8]
MOV ECX,36        ;初始化堆栈大小计数
MOV EAX,CCCCCCCC    ;局部变量用全C初始化
REP STOS DWORD PTR ES:[EDI]    ;循环填C


MOV DWORD PTR SS:[EBP-8],test.0041574C    ; ASCII "ASDFGHJ"
;0041574C地址位于.rdata节中 字符串地址。
char *a = "ASDFGHJ";
可以理解成a= (int)"ASDFGHJ";
  

MOV DWORD PTR SS:[EBP-14],test.0041574C   ; ASCII "ASDFGHJ"
可以理解成 b= (int)"ASDFGHJ";

在装入内存运行时,.rdata节中有这个串,
a和b 作为主函数的局部变量,位置在堆栈中,a地址SS:[EBP-8],b地址
SS:[EBP-14],他们的内容都是一个int型的4字节地址0041574C。对于它们
的使用都是通过0041574C使用的,内存中并不会有2个或多个"ASDFGHJ",输出
ab的值当然都一样都是0041574C,但是ab的地址是不同的。



MOV ESI,ESP
MOV EAX,DWORD PTR SS:[EBP-14]   
PUSH EAX    ; 给printf传参b

MOV ECX,DWORD PTR SS:[EBP-8]   

PUSH ECX    ;给printf传参a

PUSH test.0041573C   ; ASCII "a=%lx b=%lx"  格式控制字符串,也是位于.rdata中

CALL DWORD PTR DS:[<&MSVCR80D.printf>]     ; MSVCR80D.printf


3楼用的环境我没有。
但是是不是把他们当成2个”不同“的串,这个估计不是吧?因为如果是
当成2个来编译,最后输出的2个值应该位置相邻或者很近。
看截图,a的值似乎是临时分配的.

小妹,哥哥看你骨骼清奇,绝非凡人,将来必成大业,不如这样,你先把裤裤脱了,待哥哥为你开启灵窍,然后我们一起努力钻研如何
2011-03-03 07:13
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:3 
字符串确实是相等的,不过,比较两个字符串是否相等 用的是 strcmp,不是直接比较地址。
至于标准啊、实现的, 我就不怎么懂了,观望学习吧.



我就是真命天子,顺我者生,逆我者死!
2011-03-03 09:07
快速回复:学C之初的一个问题 关于字符串的 请教各位高手·。。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017592 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved