2014-05-05 146 views
0

我是學習C語言的新手,我對指針有個疑問。在char *指針上嘗試strcpy時出現C分割錯誤

例如,如果我試試這個:

char *pointer; 
strcpy(pointer,"Hello, World!\n"); 
printf(pointer); 

我得到這樣的輸出:

Segmentation Fault 

但如果我試試這個:

char *pointer = "Hello, World!\n"); 
printf(pointer); 

我得到這個:

Hello, World! 

我的問題是爲什麼它不與strcpy一起使用。 這些功能在整體上是一樣的。

第一個源代碼和第二個源代碼有什麼不同?

如果有人能夠解釋記憶中發生了什麼,這將是一件好事,以便我能更好地瞭解這一點。

+0

http://meta.stackexchange.com/a/129632/165773 – gnat

回答

6

char* pointer僅僅給你一個變量以用於訪問的存儲器位置。你還沒有分配任何內存,所以當你做strcpy時,你正在寫任何隨機/未定義的值pointer

你需要做的是這樣的:

char* pointer = calloc(LEN); 
if (pointer) 
{ 
    strcpy(pointer, "Hello World"); 
    printf(pointer); 
    free(pointer); 
} 
+1

使用'函數strncpy()'會更安全。 – Blrfl

+0

啊,好的。所以我們可以說我有 '字符* pointer' 然後指針在我的記憶中ADRESS是例如0xBFFFF800 但在這個ADRESS是一個隨機值,然後指針指向保存在0xBFFFF800右側的任意位置? – josepchappa

+0

@ user3605865是的,下一個字節可能是任何東西。它可能是你的操作系統的關閉鉤子,它可能是啓動全局熱核戰爭的控制代碼(如果它是一臺運行該類軟件的計算機)......這就是爲什麼你應該總是分配內存,以防止嘗試寫入(或讀出)你不應該訪問的內存。 – jwenting

1

「strcpy」的第一個參數應指向內存中的可用位置。在你的第一個源代碼中,你還沒有初始化任何東西的「指針」。應先通過聲明它是最大長度的字符數組初始化它,例如:

char myArray[42]; // where 42 represents the maximum capacity 
+0

好點 - 修正 – jordan