0

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

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

5 回答 5

9

如何避免?

不要修改字符串文字!

char *c = "Hella";

声明一个指向c存储在实现定义的只读内存中的字符串文字“Hella”的指针。
不允许修改此文字。尝试这样做会导致未定义的行为

您很幸运,您的程序崩溃了,未定义的行为并不总是导致崩溃,但可能会导致您的程序以任何可能的方式出现异常行为。

你需要的是一个数组:

char c[] = "Hella";

好读:
char a[] = ?string?; 之间有什么区别?和 char *p = ?string?;?

于 2013-01-09T16:08:07.103 回答
1

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

char c[] = "Hella";

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

于 2013-01-09T16:09:25.587 回答
0

您创建c它的方式指向字符串文字。你不能修改它的内容。如果您希望能够做到这一点,请使用:

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

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

于 2013-01-09T16:08:43.050 回答
0

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

const char *c = "Hella";

这有点解释发生了什么。

要覆盖您自己的记忆:

char c[] = "Hella";

更安全。

于 2013-01-09T16:09:17.433 回答
0

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

#include <stdio.h>
int main(void)
{
    char *c = strdup("Hella");
    *(c+4) = 'o';
    printf("%s\n",c);
    free(c);
}
于 2013-01-09T16:09:21.210 回答