2012-10-08 59 views
1

我正在理解指針。我在C.爲什麼這個指針操作失敗?

#include<stdio.h> 

char *my_strcpy(char *dest, char *source) 
{ 
    while (*source != '\0') 
    { 
    *dest++ = *source++; 
    } 
    *dest = '\0'; 
return dest; 
} 

int main(void) 
{ 
    char* temp="temp"; 
    char* temp1=NULL; 
    my_strcpy(temp1,temp); 
    puts(temp1); 



    return 0; 

} 

寫這個字符串拷貝功能,這個程序給出了一個segfault.If我改變char* temp1=NULLchar* temp1還是失敗。如果我將char* temp1更改爲char temp1[80],則代碼有效。該代碼也可以工作,如果char temp1[1]並給出輸出作爲溫度。我在想輸出應該是t。爲什麼它是這樣的,爲什麼我會遇到char* temp錯誤。

+0

爲什麼這個downvoted? – gizgok

回答

5

因爲您沒有爲目標字符串分配空間。您正在嘗試寫入內存位置NULL(幾乎可以肯定是0x00)。

嘗試char* temp1= malloc(strlen(temp)+1);或類似的東西。這將分配一些內存,然後你可以複製字符到它。 +1用於結尾的空字符。

如果你寫了Java和朋友,它會阻止你訪問陣列末尾的內存。但是在語言層面上,C可以讓你在任何你想要的地方寫入內存。然後崩潰(希望立即但可能在下週)。數組不是嚴格執行的數據類型,它們只是分配和引用內存的慣例。

如果你創建它爲char temp1[1]那麼你正在堆棧上分配一些內存。可能可以訪問附近的內存(可以讀取和寫入),但是您將在其他內存中使用其他內存。這是一個經典的內存錯誤。

也風格:我個人建議不要使用++ s的返回值。這很難閱讀,讓你思考三次。

*dest = *source; 
dest++; 
source++; 

更清楚。但那只是我的個人意見。

+0

這並不能解釋爲什麼分配一個字節(使用temp1 [1])允許存儲完整的字符串。或者那是運氣? – Joost

+0

啊,是的,我已經添加了解釋。 – Joe

+0

感謝您的答案......它現在有效。 – gizgok

0

您必須爲目標參數分配空間。

當您使用char temp1[80]時,將在內存中分配80個字節。

可以在靜態的方式分配內存,像陣列,或使用malloc功能