| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 984 人关注过本帖
标题:C语言中一个有趣的现象,有解释否?
只看楼主 加入收藏
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
结帖率:98.48%
收藏
已结贴  问题点数:100 回复次数:18 
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
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:100 
我上次跟某人解释过,声明为数组的入口指针是常指针,不能被赋值。但你现在构造的string数据类型不是数组类型,编译器不认为这个变量是const性质的。

授人以渔,不授人以鱼。
2012-04-14 12:04
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
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
你也结得太快了吧

授人以渔,不授人以鱼。
2012-04-14 12:14
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
收藏
得分:0 
回复 4楼 TonyDeng
要的就是速度,哈哈。

我们都在路上。。。。。
2012-04-14 12:15
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
根据原理分析,这里s1=s,是复制赋值,复制的结构是两份的,但复过来的ch是指针副本,所以它指向的仍然是同一个地址。如果分别修改两份副本的数据,应该看到是两份的证据。

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

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

我们都在路上。。。。。
2012-04-14 12:34
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
收藏
得分:0 
结得太快了

总有那身价贱的人给作业贴回复完整的代码
2012-04-14 12:42
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
是结的太快了,应该还有研究的空间。这种结构体用=赋值的实际操作到底如何?根据7楼说的实验结果,我6楼的说法有错误,不仅仅是复制指针,而是把整个结构体的内存复制了一份,而s的初始化是有点怪异的,如果是这样复制的话,它似乎是根据s.ch指针的指示去寻找外部数据复过来另存为一份新的副本——我原先以为仅仅是把ch指针的地址复过来。

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

授人以渔,不授人以鱼。
2012-04-14 12:48
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
快速回复:C语言中一个有趣的现象,有解释否?
数据加载中...
 
   



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

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