2013-05-22 135 views
4

昨天我對自制的「strcpy」函數有點麻煩。它現在雖然工作,但我有點困惑!陣列和指針之間的區別

char* a = "Hello, World!"; //Works 
char b[] = "Hello, World!"; //Works also 

strcpy(a, "Hello!"); //Segmentation fault 
strcpy(b, "Haha!!"); //Works.. 

差異在哪裏?爲什麼字符指針會導致「分段錯誤」?

爲什麼這甚至可以工作? :

char* a = "Haha"; //works 
a = "LOL"; //works.. 
+0

我刪除了C++標記,因爲這是關於C子集(甚至在那裏你不會自己實現'strcpy')。 –

+0

閱讀C常見問題的這一部分:http://c-faq.com/aryptr/aryptr2.html – Claudio

+0

@honk是的,這是有道理的 –

回答

14
char* a = "Hello, World!"; 

爲您提供了一個指向字符串常量。字符串文字可能存在於只讀存儲器中,因此其內容無法更改。

char* a = "Haha"; //works 
a = "LOL"; //works.. 

將指針a更改爲指向不同的字符串文字。它不會嘗試修改任何字符串文字的內容,因此安全/正確。

char b[] = "Hello, World!" 

在堆棧中聲明一個數組並將其初始化爲字符串文本的內容。堆棧內存是可寫的,所以它可以非常安全地改變這個內存的內容。

+0

所以我不能修改字符指針中的單個字符,對不對? –

+2

@NormalPeopleScareMe沒錯。它指向一個字符串*常量*。 – 2013-05-22 13:23:45

+4

嗯,這是未定義的行爲,所以它可能工作,或者它可能不會。我的建議是總是假定它不會。 –

1

在你的第一個例子中,因爲你試圖寫入a指向的只讀存儲器,你會得到分段錯誤。如果你想使用指針然後在堆上分配內存,使用和刪除它使用後。 其中b是一個用「Hello,World!」初始化的字符數組。

在第二個例子中,你正在使指針指向不同的字符串,應該沒問題。

+0

我覺得這個答案非常有幫助。我不知道字符串文字是否位於只讀存儲器中。我還發現一個教程如何結合使用字符指針和strcpy在這裏導致分段錯誤,他們分配內存,我無法回顧爲什麼他們這樣做。謝謝。 –

相關問題