| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 984 人关注过本帖
标题:C语言中一个有趣的现象,有解释否?
只看楼主 加入收藏
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
整理一下思路,似乎是这样:按照结构体的原理,这里string应是6byte(不考虑对齐之类按理论算),复制肯定是6byte一起复的(memcpy),最终两份在内存中应是完全不同的空间,因此现在应该考虑初始化的问题,string s = { "Hello" }这个动作,可能也是把静态内存中的"Hello"复制到s空间了。因此有必要再研究这个初始化的操作。

根据C++的原理,直接初始化应是string s("Hello"),这样编译器是不会做复制动作的,而=是做了。楼主用的应该是C++编译器,在C中,这种做法不知会如何。

10楼的现象,是可以解释的:两个地址相差0x02,正好是一个指针尺寸,说明这两个指针并排在一起,但它们所指向的地址,应该也是不同的,但两个地址中的内容却一样。

查看一下,内存中是不是有三份"Hello"。

[ 本帖最后由 TonyDeng 于 2012-4-14 13:24 编辑 ]

授人以渔,不授人以鱼。
2012-04-14 13:17
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
收藏
得分:0 
T版呀,偶用的是C编译,没有用CPP,就是怕这个问题有干扰。
两个地址相差0x02,如果用strcpy改变s的内容为"vfp",s1里面的内容还是hello,但观察s时面实际上是'v','f','p''\0','o', '\0',当然,这是strcpy函数的问题,不会复盖后两个字符。
这个问题还真有趣。

我们都在路上。。。。。
2012-04-14 13:26
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
回复 12楼 hellovfp
这样是符合我上面所说的,设计一个实验彻底验证一下?

授人以渔,不授人以鱼。
2012-04-14 13:31
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
收藏
得分:0 
回复 13楼 TonyDeng
嗯,偶得再想想,可能还得看看产生的反汇编代码,或许能够解释是否有三份同样的内容在内存中。

我们都在路上。。。。。
2012-04-14 13:35
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
收藏
得分:0 
string s = {"hello"};
0040DB48   mov         eax,[string "hello" (00422fa4)]  果然还有一份在内存中 0x00422fa4。
0040DB4D   mov         dword ptr [ebp-8],eax
0040DB50   mov         cx,word ptr [string "hello"+4 (00422fa8)]
0040DB57   mov         word ptr [ebp-4],cx

s1 = s 这句的反汇编
0040DB5B   mov         edx,dword ptr [ebp-8]
0040DB5E   mov         dword ptr [ebp-10h],edx
0040DB61   mov         ax,word ptr [ebp-4]
0040DB65   mov         word ptr [ebp-0Ch],ax

在内存中找到了,vc6的内存观察器不怎么好用,哈哈。

[ 本帖最后由 hellovfp 于 2012-4-14 13:48 编辑 ]

我们都在路上。。。。。
2012-04-14 13:44
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
嗯,原理应该是这样的了。

授人以渔,不授人以鱼。
2012-04-14 13:57
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
收藏
得分:0 
这说明,呵呵,当脑袋不清醒的时候,应该去读读汇编代码。。。哇哈哈,这就是探索程序的乐趣所在。

我们都在路上。。。。。
2012-04-14 14:02
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
哈哈 围观

梅尚程荀
马谭杨奚







                                                       
2012-04-14 14:58
你们都要疼我哦
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:火星
等 级:贵宾
威 望:49
帖 子:1296
专家分:2746
注 册:2008-7-13
收藏
得分:0 
strcpy(s2, "vfp");
 strcpy(s.ch, "hello");
 _puts(s3);
 *(_DWORD *)&s1.ch[0] = *(_DWORD *)&s;
 *(_WORD *)&s1.ch[4] = *(_WORD *)&s.ch[4];
 _puts(s1.ch);

小妹,哥哥看你骨骼清奇,绝非凡人,将来必成大业,不如这样,你先把裤裤脱了,待哥哥为你开启灵窍,然后我们一起努力钻研如何
2012-04-14 15:11
快速回复:C语言中一个有趣的现象,有解释否?
数据加载中...
 
   



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

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