| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 984 人关注过本帖
标题:C语言中一个有趣的现象,有解释否?
取消只看楼主 加入收藏
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
结帖率:98.48%
收藏
已结贴  问题点数:100 回复次数:8 
C语言中一个有趣的现象,有解释否?
#include <stdio.h>

typedef struct _string
{
    char ch[6];
}string, *pstring;


int main()
{
    char s2[4] = "vfp";
    char s3[4];
    string s = {"hello"};
    string s1;

    //s3 = s2; 这句是不能编译的,也就是说不能将字符串附给另一个字符数组。
                //只能用strcpy??看下面的

    puts(s3);

    s1 = s; //在结构中的字符数组居然可以这样被附值,也就是说结构变量附值的时候。
    puts(s1.ch); //这里将输出"hello";


    return 0;
}

看蓝色部分的问题,能解释否?
搜索更多相关主题的帖子: 居然 include C语言 字符串 
2012-04-14 11:59
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
收藏
得分:0 
回复 2楼 TonyDeng
有道理,把常指针问题给忘了,呵呵。。结帖。

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

我们都在路上。。。。。
2012-04-14 12:13
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
收藏
得分:0 
回复 4楼 TonyDeng
要的就是速度,哈哈。

我们都在路上。。。。。
2012-04-14 12:15
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
收藏
得分:0 
对的,是复制了,偶测试了一下,改变s后,s1并未改变,两份内容不同。

我们都在路上。。。。。
2012-04-14 12:34
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
收藏
得分:0 
偶观察了一下s和s1中ch指针地址值,是不同的,
s中0x0012ff70
s1中是0x0012ff68
s1在后面是不能够使用s1 = {"vfp"};这种方式再改值的。
应该是和s初始化有关的问题,或许不同的编译器有不同的结果。

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

我们都在路上。。。。。
2012-04-14 13:07
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
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
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
收藏
得分:0 
这说明,呵呵,当脑袋不清醒的时候,应该去读读汇编代码。。。哇哈哈,这就是探索程序的乐趣所在。

我们都在路上。。。。。
2012-04-14 14:02
快速回复:C语言中一个有趣的现象,有解释否?
数据加载中...
 
   



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

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