【问题标题】:segmentation fault after manipulating c string with secondary pointer [duplicate]使用辅助指针操作 c 字符串后出现分段错误 [重复]
【发布时间】:2018-07-31 19:15:28
【问题描述】:

我遇到了 c 字符串的问题,我想保留原始字符串的地址并使用另一个 c 指针操作字符串,但是当尝试使用原始或辅助指针打印该字符串时会出现分段错误将字符串声明为字符数组不会出现此类错误。我不使用数组,也不想丢失原始地址。请指出问题。

/* segmentation fault when run */
char *string = "Hello World";
char *nick = string;
while(*nick)
    *nick++ = '0';
printf("%s\n", string);

/* display 000000000000 when run (wished result)*/
char array[] = "Hello World";
char *nick = array;
while(*nick)
    *nick++ = '0';
printf("%s\n", array);

【问题讨论】:

  • 像“Hello World”这样的字符串文字可能(并且经常)分配在只读内存中。如果你想要一个可修改的字符串,声明一个数组,并使用该字符串来初始化数组。
  • Lee Daniel Crocker ,你的意思是没有办法拥有像我的 *string 这样的可写字符串?
  • 您将分配一个可写缓冲区,就像在您的第二个代码示例中一样,或者使用malloc()
  • @Davislor 谢谢,我选择了 malloc 和 strcpy 的好主意来实现结果。
  • 这行得通。你也可以看看strdup()

标签: c pointers segmentation-fault


【解决方案1】:

第一个代码示例将指针初始化为字符串常量的开头。修改字符串常量是未定义的行为

事实上,你永远不应该写char *s = "hello world";。总是写const char *s,或者更好的是const char* const s,如果它指向一个字符串常量。你甚至被允许拥有一个不是const 别名字符串常量的指针的唯一原因是为了与const 关键字存在之前编写的代码向后兼容。在新代码中没有任何充分的理由这样做。

第二个代码示例创建一个带有静态存储的数组。修改那个数组就好了。

【讨论】:

    猜你喜欢
    • 2020-10-02
    • 1970-01-01
    • 2019-08-21
    • 1970-01-01
    • 1970-01-01
    • 2018-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多