2012-11-29 69 views
1

可能重複:
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;機智h以下錯誤:

Thread [1] (Suspended : Signal : EXC_BAD_ACCESS:Could not access memory)  
    main() at mainclass.cpp:64 0x100000d74 

我使用GCC作爲MAC OSX和Eclipse上的編譯器作爲IDE。

+1

這只是一個SegFault。 –

回答

3

在您的代碼中,c指向字符串文字。行*c = c2嘗試修改字符串文字,即undefined behaviour。未定義行爲的一種可能的表現是字符串文字被放入只讀存儲器,並且您得到一個SIGSEGV或類似的文字。

如果你改變了代碼如下所示,它應該工作:

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

現在c點到一個數組。與字符串文字不同,可以修改數組的內容。

最後,您的while循環不正確地指向一個指針的值,而不是它指向的值。您正在尋找一個空終止符('\ 0')。它應該是這樣的:

while (*c) 
{ 
    ... 
    c++; 
} 
+0

@NPE請保留「undefined behavior」wiki頁面的鏈接... – Mohammad

2

當你這樣做:char *c = "Hello World!! !!";然後Ç是一個指針指向內存 是在代碼的一部分,所以不能你改變它。

但如果你有char c[] = "Hello World!! !!";然後Ç是堆棧的字符數組,這樣你就可以改變它。

在這種情況下,最好這樣做:char const *c = "Hello World!! !!";因爲如此,如果您嘗試更改字符串,您的程序不會崩潰,則會出現編譯器錯誤並且不會運行程序,這是好得多。