代码是不言自明的,但它给了我分段错误,为什么?:\
#include <stdio.h>
int main(void)
{
char *c = "Hella";
*(c+4) = 'o';
printf("%s\n",c);
}
代码是不言自明的,但它给了我分段错误,为什么?:\
#include <stdio.h>
int main(void)
{
char *c = "Hella";
*(c+4) = 'o';
printf("%s\n",c);
}
如何避免?
不要修改字符串文字!
char *c = "Hella";
声明一个指向c
存储在实现定义的只读内存中的字符串文字“Hella”的指针。
不允许修改此文字。尝试这样做会导致未定义的行为。
您很幸运,您的程序崩溃了,未定义的行为并不总是导致崩溃,但可能会导致您的程序以任何可能的方式出现异常行为。
你需要的是一个数组:
char c[] = "Hella";
将您的字符串放入分配到堆栈上的数组中:
char c[] = "Hella";
因为如上所述,字符串文字通常是只读的。
您创建c
它的方式指向字符串文字。你不能修改它的内容。如果您希望能够做到这一点,请使用:
char c[6] = "Hella";
c[4] = o;
或者使用动态分配的 char 数组。
您正在尝试覆盖文字。真的,您的代码应该是:
const char *c = "Hella";
这有点解释发生了什么。
要覆盖您自己的记忆:
char c[] = "Hella";
更安全。
您不能修改在代码中定义的字符串。如果要修改它们,请使用 strdup。
#include <stdio.h>
int main(void)
{
char *c = strdup("Hella");
*(c+4) = 'o';
printf("%s\n",c);
free(c);
}