2013-12-11 50 views
0

只要將值分配給任何不適用於Windows 7(32位)環境下的指針變量。包含這樣的代碼的程序正在執行錯誤。 其實我試圖連接兩個字符串而不使用任何庫函數。 例子:Windows 7下的C++指針

int main() 
    { 
     char *s1 = "Hello"; 
     char *s2 = "World"; 
     char *p; 
     p = s1; 

     while(*s1 != '\0') 
      s1++; 

     while(*s2 != '\0') 
     { 
      *s1 = *s2; // this line creating problem 
      s1++; 
      s2++; 
     } 
     *s1 = '\0'; // this line also creating problem 

     while(*p != '\0') 
     { 
      cout<<*p; 
      p++; 
     } 


     return 0; 

    } 
+9

**絕不**使用非const char *'指向字符串文字。 – chris

+0

這真的是C++嗎? 'char * s1 =「你好」;'甚至不能編譯。 (......)(...)
'...>。<) – 2013-12-11 17:08:17

+2

@ H2CO3,仍然可以預C++ 11。它只在那裏被棄用。無論如何,AFAIK,編譯器仍然會以任何理由在C++ 11中接受它。 – chris

回答

4

您還沒有分配的空間寫進去 - 這就是爲什麼你所遇到的問題。

您已創建s1,並將其指向某個只讀內存,並且當您嘗試追加時,您正在寫入該區域。

你可以改爲設置p指向a)你擁有的(有權寫入,而不僅僅是物理能力)和b)足夠大的存儲空間,以便完全分配。

最簡單的方法是使用std::string - 畢竟,你說你正在使用C++。

0
char *s1 = "Hello"; 
char *s2 = "World"; 

當您創建S1和S2這樣,你可以不寫:

*s2 = anything; 

因爲串池s1s2默認情況下不可變的。

0

這裏,"Hello"是一個字符串,它是由定義consts1是指向該字符串文字的第一個元素的指針,因此指向只讀內存。您無法更改只讀內存,因此您無法更改s1指向的內容。這本來是更accrate和更好,如果你曾宣稱此爲:

const char *s1 = "Hello"; 

在C++ 03,有一個特殊的規則,允許分配指針指向一個字串非const指針。但是,該規則在C++ 11中已被刪除,並且您的代碼現在實際上是非法的。

這是件好事,因爲即使在C++ 03中,您也無法(合法地)使用s1做任何事,如果它是const,您就無法做到。

後來,你做的公然錯誤的東西:

while(*s2 != '\0') 
     { 
      *s1 = *s2; // this line creating problem 
      s1++; 
      s2++; 
     } 

我並不感到驚訝,這行代碼是造成你的問題 - 它喚起未定義行爲,因爲你正在修改只讀存儲器。

它看起來像你真的想做的是創建一個字符串,它是用一些已知的(不變的)值初始化的,然後再修改字符串。爲了做到這一點,你必須複製字符串文字。要做到這一點最簡單的方法是使用std::string

std::string s1 = "Hello"; 

這裏"Hello"仍然是一個字符串,但s1正在緊張施工關閉它。 s1與字符串文字完全分離,現在您可以根據自己的意願對其進行修改。