| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1207 人关注过本帖
标题:常量好烦人
只看楼主 加入收藏
小牛
Rank: 1
等 级:新手上路
威 望:1
帖 子:434
专家分:8
注 册:2006-10-1
结帖率:81.48%
收藏
 问题点数:0 回复次数:18 
常量好烦人

有这一段程序
#include<stdio.h>
void main()
{ char *p;
p="abcd";
p[2]='x';
printf("%s",p);
}
该程序为将一个字符串常量的首地址赋给p,然后通过p引用该字符串的某个空间,
改变里面的值。这在TC里运用是可以的。结果为abxd.

abcd 是字符串常量,在C语言中常量的值是不可改变的。但在这里,它的值为什么
可以被改变呢?

还有一个问题,这个程序在VC++6。0运行不能通过。为什么?

搜索更多相关主题的帖子: 常量 STRONG abcd 字符 
2006-10-03 09:05
sunyuantz
Rank: 1
等 级:新手上路
威 望:1
帖 子:407
专家分:0
注 册:2006-3-20
收藏
得分:0 
我的想法是字符串在内存中会不会按字符数组的形式存放,所以用指针可以修改,而VC++6.0中有两类,一类是C-串,一类是string,系统不知道你用那种所以会报错,以上紧紧是我的猜测,请大虾也帮我解答一下这个问题!

我不是名人,所以不要签名。等哪天我成名人了......你都认识我了还要签名干嘛!
2006-10-03 10:14
小牛
Rank: 1
等 级:新手上路
威 望:1
帖 子:434
专家分:8
注 册:2006-10-1
收藏
得分:0 
不解,字符串不是按字符数组形试存放?
我问的是字符串“常量”为什么能改变。

本店经营各类国际品牌运动鞋,板鞋,休闲鞋,有李宁,nike,匹克,阿迪达斯。
2006-10-03 10:18
sunyuantz
Rank: 1
等 级:新手上路
威 望:1
帖 子:407
专家分:0
注 册:2006-3-20
收藏
得分:0 

我的意思是说字符串常量在内存的存储形式和字符数组的形式可能相同,你用指针访问地址然后改变地址的内容,因为你是给变量P赋了常量字符串,这时内存会开辟一定的空间存储他们,比如输入"abcd",大概会占4个字节,每个字节会有一个内存地址与其对应,然后用指针访问,如a字母的地址为2000,b为2001,依次类推c为2002,现在指针p指向2000,那p[2]就指向2002,在修改其内容为x,我是这样理解的,也不知道对不对


我不是名人,所以不要签名。等哪天我成名人了......你都认识我了还要签名干嘛!
2006-10-03 10:59
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 

请弄清楚什么叫字符串常量.你将一个字符串赋给一个指针,这个指针还是变量的.
像这样的:"asdfghjk".直接放在这里才叫常量.但绝对不是指用它赋值的对象也是常量,就相当于给指针赋初值.

strcmp(p,"abcd"); //字符串常量用在这里可以.它不可以改变.
你的错误在于没有给指针分配空间,这点在有的编译器是可以通过的(win-tc).但VC++不可以.


倚天照海花无数,流水高山心自知。
2006-10-03 11:52
sunyuantz
Rank: 1
等 级:新手上路
威 望:1
帖 子:407
专家分:0
注 册:2006-3-20
收藏
得分:0 

受教,明白了


我不是名人,所以不要签名。等哪天我成名人了......你都认识我了还要签名干嘛!
2006-10-03 12:04
baidu
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:3811
专家分:0
注 册:2005-11-4
收藏
得分:0 
nuciewth的回答是错的,这个问题在这里讨论过很多次了,找一下旧贴.

还有,nuciewth在
看月亮22一贴中回答也是错的.

偶放弃所有文章版权,偶在BCCN论坛任何贴子,可转贴,可散发,可抄袭,可复制,可被冒名顶替,可被任何人引用到任何文章中且不写出引文出处,偶分文不取。
2006-10-03 13:42
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 
baidu大哥,那你就说清楚嘛,我学的不好

倚天照海花无数,流水高山心自知。
2006-10-03 13:50
baidu
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:3811
专家分:0
注 册:2005-11-4
收藏
得分:0 
还是找一下旧贴吧,老是重复回答问题很烦人的

偶放弃所有文章版权,偶在BCCN论坛任何贴子,可转贴,可散发,可抄袭,可复制,可被冒名顶替,可被任何人引用到任何文章中且不写出引文出处,偶分文不取。
2006-10-03 13:58
shuaiye
Rank: 1
等 级:新手上路
帖 子:445
专家分:0
注 册:2006-5-15
收藏
得分:0 

字符串常量在机器的内存中有自己独立的地址空间,形如 char *p="abcd";这样的语句,是把字符串常量的地址复制给了字符指针,如果直接改变指针的内容等于改变字符串常量,所以“LZ”的语句根本就是不合法的(的确有的编译器是不会检查这些错误的)。

解决办法:

const char * const p="abcd";//该语句只能指向这个字符串,P的值不能改变,也不能再指向其他字符串。


由于工作,N久都没来了!
2006-10-03 14:03
快速回复:常量好烦人
数据加载中...
 
   



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

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