为了账号安全,请及时绑定邮箱和手机立即绑定

str2 为什么不能修改??

  1 #include <stdio.h>
  2 #include <malloc.h>
  3 int main()
  4 {       
  5         char *str2;
  6         printf("input the str2 value\n");
  7         str2=(char *)malloc(sizeof(char)*10);
  8         str2="world";
  9         scanf("%s",str2);;
 10         printf("str2 is %s\n",str2);
 11         return 0;
 12 }                

按照老师说的我这里已经用malloc为str2在栈内存里面分配了空间,为什么还是不能修改啊??

正在回答

2 回答

str2="world" 这样并不是把world这几个字符复制到str2所指的区域,字符串字面量做右值时会转换为指向首字符的指针,所以这语句是把str2指向“world”这个字符串所在的位置。需要复制字符串应使用LS说的strcpy函数。

一般程序会把字符串字面量放到只读数据段中(无法被修改),所以后续通过str2来修改这些内容会引起"段错误"。

你代码的另一个问题是,在你给str2第二次赋值后就丢掉了前一次分配的指针,导致无法回收那段内存,引起内存泄漏。

1 回复 有任何疑惑可以回复我~
#1

King_J 提问者

嗯嗯,你说的是对的,用str2="world"对str2进行赋值时是将“world”的地址存到了str2中,这样改变了上一次分配的指针,会引发上面分配的内存泄露。而我用上面scanf进行重新输入时,程序认为我是在修改str2“world”,“world”是常量不能被修改,这这样就导致了程序错误。谢谢
2015-09-04 回复 有任何疑惑可以回复我~

str2="world"赋值应该改成strcpy(str2,"world"),应为"world"存在代码区不能进行修改,而用strcpy则是存在栈区。

1 回复 有任何疑惑可以回复我~
#1

onemoo

是这个意思,但表述得不太准确。 strcpy只是通过两个指针来操作其中的字符,不管他们是在哪里。 你的str2所指的内存是在堆(heap)上(因为是malloc分配的)。还有就是别忘了在使用后释放掉这段内存。
2015-09-04 回复 有任何疑惑可以回复我~
#2

King_J 提问者 回复 onemoo

嗯嗯,知道了。谢谢
2015-09-04 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

str2 为什么不能修改??

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信