1

可能重复:
为什么在写入字符串时会出现分段错误?
char a[] = “string”; 和有什么区别?和 char *p = “字符串”;

谁能指出以下程序中的问题:

#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  

我在 MAC OSX 上使用 GCC 作为编译器,在 IDE 上使用 Eclipse。

4

2 回答 2

3

在您的代码中,c指向字符串文字。该行*c = c2尝试修改字符串文字,这是未定义的行为。未定义行为的一种可能表现是字符串文字被放入只读内存中,并且您得到一个SIGSEGV或类似的。

如果您按如下方式更改代码,它应该可以工作:

char arr[] = "Hello World!! !!";
char* c = arr;

现在c指向一个数组。与字符串文字不同,允许修改数组的内容。

最后,您的 while 循环错误地以指针的值为条件,而不是它指向的。您正在寻找一个空终止符 ('\0')。它应该如下所示:

while (*c)
{
    ...
    c++;
}
于 2012-11-29T09:10:41.037 回答
2

当你这样做时:char *c = "Hello World!! !!";那么c是一个指向代码部分中的内存的指针,所以你不能改变它。

但是如果你有char c[] = "Hello World!! !!";那么c堆栈上的一个字符数组,所以你可以改变它。

在这种情况下,最好这样做:char const *c = "Hello World!! !!";因为那样的话,如果您尝试更改字符串,您的程序不会崩溃,它会出现编译器错误并且不会运行程序,这样会更好.

于 2012-11-29T09:12:40.783 回答