可能重复:
Why do I get a segmentation fault when writing to a string?
What is the difference between char a[] = “string”; and char *p = “string”;
任何人都可以在以下程序中指出问题:
#include <stdio.h>
int main()
{
char *c = "Hello World!! !!";
char c2 = 'X';
while(c)
{
if(*c == ' ')
{
printf("%s",c);
*c = c2;
}
c++;
}
return 0;
}
它在*c = c2;
崩溃并出现以下错误:
Thread [1] (Suspended : Signal : EXC_BAD_ACCESS:Could not access memory)
main() at mainclass.cpp:64 0x100000d74
我使用GCC作为MAC OSX上的编译器和Eclipse作为IDE。
答案 0 :(得分:3)
在您的代码中,c
指向字符串文字。行*c = c2
尝试修改字符串文字,即undefined behaviour。未定义行为的一种可能表现形式是将字符串文字放入只读内存中,并获得SIGSEGV
或类似内容。
如果您按如下方式更改代码,则应该有效:
char arr[] = "Hello World!! !!";
char* c = arr;
现在c
指向一个数组。与字符串文字不同,允许修改数组的内容。
最后,你的while循环错误地取决于指针的值,而不是指向指向的值。你正在寻找一个空终止符('\ 0')。它应该是这样的:
while (*c)
{
...
c++;
}
答案 1 :(得分:2)
执行:char *c = "Hello World!! !!";
时, c 是指向指向内存的指针
在代码部分中,因此无法更改它。
但是,如果你有char c[] = "Hello World!! !!";
,那么 c 堆栈中的字符数组,所以你可以改变它。
在这种情况下,最好这样做:char const *c = "Hello World!! !!";
因为那样,如果你尝试改变字符串,你的程序不会崩溃,它会出现编译错误而不会运行程序,这要好得多。