2011-03-21 60 views
0

導致EXC_BAD_ACCESS信號的測試程序。 這爲什麼會造成總線錯誤?我想把'HI'改爲'fI'。英特爾Mac上的總線錯誤,爲什麼?

//BUS ERROR TEST 

#include <iostream> 

void test(char *text) 
{ 
    text[0] = 'f'; 
} 

int main() 
{ 
    char *text = (char *)"HI"; 
    test(text); 
    std::cout << text << std::endl; 
    return 0; 
} 

回答

5

您不允許更改字符串常量,這是根據標準的未定義行爲。

如果更換:

char *text = (char *)"HI"; 

的東西,如:

char text[3]; 
strcpy (text, "HI"); 

或:

char text[] = "HI"; 

你會發現它會奏效,因爲text在這種情況下是可修改的內存。

1

你不能丟棄const,這是UB。字符串常量是隻讀的,因此編譯器可以將它們放入只讀存儲器。

使用

char text[] = "Hi!"; 

得到修改字符串。

0
char *text = (char *)"HI"; 
text[0] = 'f'; 

這實際上違背了C++標準。引用的字符串被宣佈爲const是有原因的。在你的情況下,它可能會將字符串存儲爲「代碼數據」的一部分,而不是常規的「數據」。這與將「代碼數據」區域設置爲只讀的常見用法相結合,使得您無法寫入帶引號的常量字符串。