2012-12-08 38 views
4

可能重複:
Why do I get a segmentation fault when writing to a string?C++:交換實現指向的變量

我有以下程序:

#include <iostream> 
using namespace std; 

void reverseString(char* first, char* last) 
{ 
    while(first < last) 
    { 
     cout << *first << " " << *last << endl; //for debugging; prints 'H' and 'o' then crashes 
     char temp = *last; 
     *last = *first; //this line crashes the program 
     *first = temp; 
     first++; 
     last--; 
    } 
} 

int main() 
{ 
    char* s = "Hello"; 
    reverseString(s, s + strlen(s) - 1); 
    cout << s << endl; 
} 

但是,我無法調換指針指向的值。我認爲* p = * p1應該將指向p的值設置爲指向p1的值,但似乎存在一些問題。預先感謝任何幫助!

+3

如果你不需要自己實現這個,比較喜歡'std :: reverse'。 – chris

+0

我知道,但我真的很想知道爲什麼它沒有按照我設置的方式工作。順便提一下,謝謝你的提示。 – tomKPZ

+3

您正在修改字符串文字。 – chris

回答

7

代碼對我來說很好。最可能的問題是允許編譯器假定字符串文字沒有被修改,所以它可以將它們放在只讀存儲器中。嘗試

char s[] = "Hello"; 
main()代替

,其創建字符串的寫副本

+0

工作,謝謝!我從來不知道只讀內存。 – tomKPZ

0

strlen()的頭文件丟失。

其次,它會拋出一個警告 - 從字符串常量到char *,j_random_hacker的解決方案的棄用轉換似乎解決了這個問題。

1

的替代解決方案@j_random_hacker:

char* buffer = new char[32]; 
strcpy(buffer, "Hello"); 
reverseString(buffer, buffer + strlen(buffer) - 1); 

... rest of your program ... 

delete[] buffer; 

這妥善爲C風格串然後可以通過任何函數修改分配內存。當然,您需要包含<string.h>標題以訪問strcpystrlen

+0

我會+1,但是你說「正確分配」的事實表明,使用堆棧上的本地數組(如我所建議的)某種程度上「不合適」:-P –

+0

事實並非如此。知道我決定什麼時候我的數組被解除分配,我只是感到溫暖和模糊! :) – Zeenobit