为什么这段代码运行之后会出现exception?

zrebecca 2010-08-11 09:09:54
main()
{
int result = 0;
char *s = NULL;
s = (char*)calloc(50,sizeof(char) );
s = "hello ";

s[5] = '\0';//这里出问题,貌似不能这么赋值

free(s);

return 0;
}
---------------------------------------------
其实这个问题主要是这样影起的:
main()
{
int result = 0;
char *s = NULL;
s = (char*)calloc(50,sizeof(char) );
s = "hello ";

result = trim(s);

free(s);

return 0;
}

int trim( char s[] )
{
int n;
s[5] = '\0';

for( n = strlen(s)-1; n >= 0; n-- )
{
printf( "trim_1, n:%d s[n]:%c \n",n,s[n] );
if( s[n] != ' ' && s[n] != '\t' && s[n] != '\n' )
{
break;
}

}
s[n+1] = '\0';//这里出问题
return n;
}
...全文
171 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
ChengNan_ 2010-08-12
  • 打赏
  • 举报
回复
s = "hello ";
s[5] = '\0';//这里出问题,貌似不能这么赋值

s是个指针,s=“hello”表示s指向一个不可写的常量单元,s[5]=‘\0’就会出错!
slhkzyl 2010-08-12
  • 打赏
  • 举报
回复
回一个:free函数释放的是有malloc或者calloc分配的内存空间,这必须对应,
s = (char*)calloc(50,sizeof(char) );//s指向该内存区域的首地址,free也应该释放这块区域
s = "hello ";//而你这里s指向了"hello"存储区的首地址,你后来free这个显然是错的。


just for the score!
mudunke775 2010-08-12
  • 打赏
  • 举报
回复
呵呵,加一句:free(s);也会报错。
另,LZ是猪,提问完了也不跟帖
ctwoz 2010-08-12
  • 打赏
  • 举报
回复
学习…
ningweidong 2010-08-12
  • 打赏
  • 举报
回复
s = (char*)calloc(50,sizeof(char) );
s = "hello ";
你写的什么东西啊?
先申请内存,然后,又不要了,指向一个常量字符串。你要修改其中的内容,当然会出错了。


看到楼主的结帖率。我估计这个问题又白答了。
sese53 2010-08-12
  • 打赏
  • 举报
回复
一个指针指向一个常量区"hello",怎么能够进行赋值!!
s = "hello ";直接用字符串常量赋值给一个char数组只能有这样的方式。
char s[20] = "hello",这个是正确的。
sxdkxgwan 2010-08-12
  • 打赏
  • 举报
回复
使用debug 进行调试,动态跟踪每步的结果和其中的变量
zrebecca 2010-08-12
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 sese53 的回复:]

一个指针指向一个常量区"hello",怎么能够进行赋值!!
s = "hello ";直接用字符串常量赋值给一个char数组只能有这样的方式。
char s[20] = "hello",这个是正确的。
[/Quote]对的。谢谢你:)
zrebecca 2010-08-12
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 honemay 的回复:]

s = "hello ";这里o后面有个空格
s[5]是常量,你给常量赋值,肯定报错!
[/Quote]谢谢,知道了。
char *pmessage = "hello";
char amessage[] = "hello";

pmessage[4] = 'a'; //no
amessage[4] = 'a'; //yes
zrebecca 2010-08-12
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 mudunke775 的回复:]

呵呵,加一句:free(s);也会报错。
另,LZ是猪,提问完了也不跟帖
[/Quote]请不要这么说我。我不是故意的,临时有事。
气死了,你才是猪呢。
honemay 2010-08-12
  • 打赏
  • 举报
回复
s = "hello ";这里o后面有个空格
s[5]是常量,你给常量赋值,肯定报错!
flairpower 2010-08-12
  • 打赏
  • 举报
回复
8楼说了,我就不说了
YTerrenceLau 2010-08-11
  • 打赏
  • 举报
回复
上面的已经回答的够仔细了,另外一点是,你不需要在hello的后面加‘\0’,“hello”是字符串,本身后面就有0的。
yanghope 2010-08-11
  • 打赏
  • 举报
回复
问题是这样的,当你用malloc开辟了50 个字节的空间的时候,s是指向这个区域的,这个区域被称为堆,你下一条语句出现问题啦:s = "hello ";字符串"hello "并没有存储在你开辟的空间内,而是存在了静态存储区,你可以分别打印一下两个s的结构,没在一个段里,而静态存储区的数据时不能改变的,你的子函数trim()内的s[5] = '\0';试图改变数据,这是不允许的,所以你可以采取另一种赋值方式strcpy(s,"hello ");
d741963250 2010-08-11
  • 打赏
  • 举报
回复
我身边没有编译器。但是我估计大概知道你错误的位置。
char *s = NULL;
s = (char*)calloc(50,sizeof(char) );
s = "hello ";

s[5] = '\0';//
这里的s="hello";
s只能获得的字符h的地址,也就是说hello存储的位置并没有在calloc分配的位置,而是在静态区域。
也就是说s本来你使用calloc分配的时候得到的是动态存储区的位置,而你后面又使用s="hello"
相当于这个时候把s赋值成为一个常量,存储的是字符s的地址。所以说你后面s[5]企图改变的是' ',而这个是常量 是不能被更改的 所以说你错误的、
我不知道对不对,只是说说而已
lazy_2010 2010-08-11
  • 打赏
  • 举报
回复
s = (char*)calloc(50,sizeof(char) );
s = "hello ";

这样写是错的,你可以试一试,不执行 trim,直接 free 会出现内存错误的。

原因是:s = "hello "; 只是对于指针 s 进行赋值了,不是修改指针指向的内容。
sbdt123 2010-08-11
  • 打赏
  • 举报
回复
可以吧!!!
zrebecca 2010-08-11
  • 打赏
  • 举报
回复
不是,trim的作用是把空格等去掉,然后最后一位赋值为'\0',可是出现exception
lazy_2010 2010-08-11
  • 打赏
  • 举报
回复
你应该是想 strcpy(s, "hello "); 吧; = 是把指针赋值给了 s 了。
zrebecca 2010-08-11
  • 打赏
  • 举报
回复
没人回答?

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧