如何避免分段错误?

时间:2013-01-09 16:07:18

标签: c segmentation-fault

代码是不言自明的,但它给了我分段错误,为什么? :\

#include <stdio.h>
int main(void)
{
    char *c = "Hella";
    *(c+4) = 'o';
    printf("%s\n",c);
}

5 个答案:

答案 0 :(得分:9)

  

如何避免?

不要修改字符串文字!

char *c = "Hella";

将指针c声明为存储在实现定义的只读存储器中的字符串文字“Hella”。
您不能修改此文字。尝试这样做会导致未定义的行为

你很幸运,你的程序崩溃,未定义的行为并不总是导致崩溃,但可能导致程序以任何可能的方式表现得很奇怪。

这里需要的是一个数组:

char c[] = "Hella";

好读:
What is the difference between char a[] = ?string?; and char *p = ?string?;?

答案 1 :(得分:1)

将您的字符串放入分配到堆栈的数组中:

char c[] = "Hella";

因为如上所述,字符串文字通常是只读的。

答案 2 :(得分:0)

您创建c的方式指向字符串文字。你不能修改它的内容。如果您希望能够这样做:

char c[6] = "Hella";
c[4] = o;

或者使用动态分配的char数组。

答案 3 :(得分:0)

您正在尝试覆盖文字。你的代码真的应该是:

const char *c = "Hella";

哪种方式可以解释发生了什么。

覆盖自己的记忆:

char c[] = "Hella";

更安全。

答案 4 :(得分:0)

您无法修改代码中定义的字符串。如果要修改它们,请使用strdup。

#include <stdio.h>
int main(void)
{
    char *c = strdup("Hella");
    *(c+4) = 'o';
    printf("%s\n",c);
    free(c);
}