2012-12-12 99 views
0

可能重複時:
Why do I get a segmentation fault when writing to a string?訪問衝突錯誤逆轉串C++

下面的簡單函數應扭轉到位的字符陣列。

void reverse(char* str) 
{ 
    char* last = str; 

    // find end of the string 
    while(*last) { 
     ++last; 
    } 

    // swap characters until the pointers meet in the middle 
    while(str < last) 
    { 
     --last; 
     char temp = *str; 
     *str = *last; 
     *last = temp; 
     ++str; 
    } 
} 

int main() 
{ 
    char* a= "Hello"; 
    reverse(a); 
    return 0; 
} 

代碼編譯。但它會引發有關訪問衝突的運行時錯誤。根據調試器的罪魁禍首是以下行:

char temp = *str; 

任何想法爲什麼會發生?

+0

這不再是有效的C++代碼,並有很好的理由。 – Puppy

+0

您包含'',但不要使用任何流,並且您使用'using namespace std',但不要使用該名稱空間中的任何內容。 – dreamlax

回答

6
char* a= "Hello"; 

指針a指向字符串文字。根據標準,嘗試修改字符串文字會導致未定義的行爲。在實現的情況下,分段錯誤表明編譯器正在選擇將字符串文字放置在不可修改的內存中。

聲明a是一個可修改的字符串。例如,像這樣:

char a[] = "Hello"; 
+2

來吧,你應該知道更好地回答這樣的問題與數百重複 –

+0

謝謝!我學到了東西。 – Alexey

+3

@EdS。這是爲什麼? –