2013-01-31 44 views
0

可能重複:
Modifying a C string: access violation動態C字符串訪問

int main() 
    { 
     char str_1[7] = "string"; 
     char* str_2 = new char[7]; 
     str_2 = "string"; 
     str_1[2] = 'a'; //ok 
     str_2[2] = 'a'; //error 

     return 0; 
    } 

我得到 「訪問衝突」 錯誤這裏str_2[2] = 'a'; 我不明白爲什麼我不能訪問動態字符串通過索引在這裏(VS2010)謝謝。

+2

必須有很多這個重複。 – hmjd

+0

任何你不使用'std :: string'的原因? – chris

+0

只是試驗 –

回答

3

你不能像你那樣分配給一個字符串。您不需要複製字符串內容,而是複製指針。因此str_2現在指向一個字符串文字,並且不能被修改。要複製字符串的內容,請使用strcpy

在你的代碼版本甚至worse-存在在那裏你調用了new行分配給str_2內存內存泄漏。

3

而不是str_2 = "string";strcpy(str_2, "string"),因爲在你的情況下,你正試圖修改字符串文字。

3

分配內存

char* str_2 = new char[7]; 

忽略以前的分配(並導致內存泄漏),並使得str_2點到不變的字符串字面

str_2 = "string"; 

str_2現在將實際點到const char[],隱式轉換爲char*只是爲了向後兼容。實際上它指向只讀內存。

1

問題是,你不會對任何地方的內存單元做任何「硬拷貝」,你只要改變指針指向不同的地方。字符串是數組,因此必須使用strcpy或memcpy函數進行復制。

char* str_2 = new char[7];分配動態存儲器。 str_2 = "string";讓指針str_2指向一個完全不同的存儲單元,忘記它用來指向分配的動態存儲器。由於沒有剩餘的內存引用,因此您知道內存泄漏問題。

str_2現在指向在駐留在只讀存儲器中的恆定字符串文字「串」。 str_2[2] = 'a';嘗試修改該內存,這是未定義的行爲,並且會導致崩潰。

要理解爲什麼str_1情況下工作,它掌握的編程概念intialization分配是很重要的。 'str_1'的情況是可行的,因爲您分配了7個字節,然後初始化這些字節以包含「字符串」。在變量初始化中,=將會從實際的字符串字符串「string」所在的只讀存儲器到分配了str_1的RAM中的堆棧中產生硬拷貝。