str2 为什么不能修改??

来源:5-3 字符数组和指针字符串

King_J

2015-09-02 16:27

  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回答

  • onemoo
    2015-09-03 20:56:56
    已采纳

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

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

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

    King_J

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

    2015-09-04 10:42:23

    共 1 条回复 >

  • King_J
    2015-09-02 18:46:53

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

    King_J 回复onemoo

    嗯嗯,知道了。谢谢

    2015-09-04 10:58:21

    共 2 条回复 >

Linux C语言指针与内存

指针-C语言的核心,代领大家对c语言有更加深刻的理解

116475 学习 · 250 问题

查看课程

相似问题