标题:这是什么怪错误
只看楼主
cccer
Rank: 1
等 级:新手上路
帖 子:37
专家分:0
注 册:2004-5-5
得分:0 
Turbo c++  version 1.00

2004-05-06 21:20
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
得分:0 

看到你9楼的回复我很吃惊,还真的以为自己错了,然后我用Dev 和VC 都试了一下,没有你所说的以上结果。

在跟你说一下, char * str = "assssss";

str[0] = 'b'; // 这是不可以的。

原因如下:str 是一个指针,也就是说 str 是一个地址,在这个地址下存放着字符串 "assssss" 这个字符串的值是不允许被修改的。因为它是常量。

来比较 char str[20] = "assssss"; str[0] = 'b'; // 这个是被许可的。

当你建立这个字符数组的时候,你就为他开辟了內存空间, 并通过赋值的方式将字符串"assssss" 放入那个你说开辟的內存空间.

str[0] = 'b'; 当这条语句执行时,你操作的是这个字符数组,而并非那个字符常量。他们两者的地址是不一样的。

如果你想看他们两者的存放地址,可以通过如下语句:

#include <stdio.h> int main() { char * p_str = "assssss"; char * p_c = "assssss";

printf("The address of constant string:\n"); printf("%d\n", &"assssss"); // decimal printf("%0x\n",p_c); // hexidecimal

char str[20] = "assssss"; printf("The address of the char array:\n"); printf("%d\n", str); printf("%0x\n", str);

printf("Now you will find they are not same.");

return 0; }


自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2004-05-06 22:10
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
得分:0 

如果你那个编译器允许对常量进行操作的话,你可以把它扔掉了. 因为这是违背C以及 C++原则的. 常量是不可以进行操作的.


自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2004-05-06 22:14
cccer
Rank: 1
等 级:新手上路
帖 子:37
专家分:0
注 册:2004-5-5
得分:0 

上传不起来图片;真想让你看看我这边的输出;跟你说的不一样;怎么回事

[此贴子已经被作者于2004-05-06 22:30:01编辑过]


2004-05-06 22:22
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
得分:0 

或者确切的说, 常量是不可以被修改的。

你可以下载一个免费的编译器, Dev 一个很符合标准的编译器。

http://www.bloodshed.net/devcpp.html


自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2004-05-06 22:29
cccer
Rank: 1
等 级:新手上路
帖 子:37
专家分:0
注 册:2004-5-5
得分:0 

我用你刚才的代码,输出为

the address of constant string:

241

c4

the address of the char array:

-32

ffe0

now you will find they are not same

合理不合理啊?

[此贴子已经被作者于2004-05-06 23:12:43编辑过]


2004-05-06 22:39
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
得分:0 

Dev 做的不是对用户很友好,所以我通常不用它,但考虑到VC 的不标准性,所以还是会用Dev来测试的。

像这样的小程序,操作如下: ctrl+o 文件打开 ctrl+F9 编译 ctrl+F10 运行 F9编译+运行

另外,在程序的最后一行之前, 即 return 0; 之前, 添加一句 : system("pause"); 这样你就能看到运行结果了。


自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2004-05-06 22:56
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
得分:0 
回答你16楼的问题, 你是不是对那个负号感到吃惊啊? 那个负号表示,Integer 数据超出数据上限。我估计你还是用那个Turbo C, 是不是?如果 integer 定义为 16 位,即 2 个 byte, 自然他的数据上限就小了。

自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2004-05-06 23:31
cccer
Rank: 1
等 级:新手上路
帖 子:37
专家分:0
注 册:2004-5-5
得分:0 

我又用win-tc试了一下;还是与前面的一样;

你也下载来运行那个代码看看;这个编译器用起来非常简单;几乎不用学,中文的

http://202.107.76.62/dispbbs.asp?boardID=2&ID=218


2004-05-07 19:10
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
得分:0 

忘记你那个tc 吧,我建议你把它删掉, 你为什么就不用Dev 呢, 今天在CSDN 也看到一片类似的帖子,我待会儿给你个连接。

你显然到现在还不相信我的话。你那个Turbo C 实在是害人不浅。


自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2004-05-07 19:47



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-1052-1-1.html




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

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