在走一个字符串时改变字符会导致程序崩溃

时间:2012-11-29 09:09:23

标签: c++ macos gcc

  

可能重复:
  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。

2 个答案:

答案 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!! !!";因为那样,如果你尝试改变字符串,你的程序不会崩溃,它会出现编译错误而不会运行程序,这要好得多。