2011-07-23 63 views
1

我實現了一個簡單的strcpy,但是當我運行它時,它總會給出分段錯誤。 請幫忙!爲什麼在執行strcpy時出現分段錯誤?

下面是我的代碼:

#include <stdio.h> 

char* mystrcpy(char *dst, char *src){ 
    char *ptr = dst; 
    while (*src !='\0') { 
     *dst = *src; 
     dst++; 
     src++; 
    } 
    return ptr; 
} 

int main (int argc, char **argv) { 
    char *str1 = "abc"; 
    char *str2 = "def"; 
    char *str3 = NULL; 
    str3 = mystrcpy(str2, str1); 
    printf("str2 now is %s", str2); 
    printf("str3 is %s", str3); 
    return 0; 
} 
+0

在'str1'和'str2'中沒有空間存儲字符串內容。嘗試'char str1 [100] =「abc」'和'char str2 [100] =「def」'和'char str3 [100] =「」' – Stan

+4

另請注意,標準'strcpy' null終止目標。你可能希望你也這樣做。 –

+0

你可以把這個循環寫成'while(* src)* dst ++ = * srC++;'這個事實被很多人認爲是C的最大優點之一。我明白這樣的代碼會讓新手感到恐慌,但對於我們來說,盯着這樣的代碼很多很多年,它的密集度就像簡單而純粹的美麗。還要注意Charles所說的。 「do ... while」循環會更好。 – sbi

回答

-3

而{ * DST = * SRC(* SRC = '\ 0'!)

你需要在這裏提領你的指針,使用&,而不是*

編輯:

看起來像我有我自己的個人顱段錯誤,在這裏 - 在早晨太早!

cnicutar的解釋(分配一個指針指向一個字符串常量char *str2 = "def";,然後嘗試寫入到該位置)是更合理...

+1

'&'是「地址」,而不是取消引用。前綴'*'是正確的 –

9

這些是隻讀的。給他們寫信導致未定義的行爲

char *str1="abc"; /* Read-only. */ 
char *str2="def"; 

while (*src !='\0') { 
    *dst = *src; /* Writes into read-only memory. */ 

看到這個C FAQ

字符串常量實際上不變。編譯器可能會將它們放置在不可寫入的存儲中,因此修改它們並不安全。

another explanation。你應該試試

char str1[]="abc"; 
char str2[]="def"; 
+1

正確。但與C++不同,字符串文字的類型爲「char []」,而不是「const char []」,因此編譯器在嘗試修改字符串文字時通常不會發出警告。這有點不一致,但它被定義爲避免破壞現有代碼(從「const」被添加到該語言之前)。你可以通過聲明'const char * str1 =「abc」'來幫助編譯器。 –