可能重复:
为什么在写入字符串时会出现分段错误?
int main()
{
char *c = "abc";
*c = 'd';
printf("%s",c);
return 0;
}
当我尝试在 C 中运行该程序时,程序崩溃了。我想知道这里的错误是什么?
可能重复:
为什么在写入字符串时会出现分段错误?
int main()
{
char *c = "abc";
*c = 'd';
printf("%s",c);
return 0;
}
当我尝试在 C 中运行该程序时,程序崩溃了。我想知道这里的错误是什么?
因为字符串文字abc
实际上存储在进程的只读区域中,您不应该修改它。操作系统已将相应的页面标记为只读,并且您尝试在那里写入时会出现运行时异常。
每当您将字符串文字分配给char
指针时,始终将其限定为const
使编译器警告您此类问题:
const char *c = "abc";
*c = 'd'; // the compiler will complain
如果你真的想修改一个字符串文字(虽然不是直接修改它本身,而是它的副本),我建议使用strdup
:
char *c = strdup("abc");
*c = 'd'; // c is a copy of the literal and is stored on the heap
...
free(c);
"abc"
是一个字符串文字。
*c = 'd'
是尝试修改该字符串文字。
您不能修改字符串文字。