代码是不言自明的,但它给了我分段错误,为什么? :\
#include <stdio.h>
int main(void)
{
char *c = "Hella";
*(c+4) = 'o';
printf("%s\n",c);
}
答案 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);
}