2013-03-20 141 views
-1
#include <stdio.h> 
char *strcpy_r(char* s, char* t); 

int main() 
{ 
    char *s = {"Bob"}; 
    char *t = {"Billy"}; 
    char *ptr; 
    ptr = strcpy_r(s, t); 
    printf("%s\n", ptr); 

    return 0; 
} 

char* strcpy_r(char* s, char* t) 
{ 
    if((*s = *t) != '\0') 
    strcpy_r(s + 1, t + 1); 
    return s; 
} 

我只是在做這個練習,但是當我編譯它時。我從main得到了一個seg故障。有人能告訴我什麼可能導致這個seg故障?遞歸strcpy函數

+0

'{「Billy」)'這是一個錯字? – Maroun 2013-03-20 06:58:32

+1

您正在嘗試修改字符串文字。這是未定義的行爲,經常崩潰。 – 2013-03-20 06:59:36

+0

對不起,這是一個錯字。我現在要解決這個問題。 – Bonnie 2013-03-20 07:00:27

回答

0

您不能覆蓋用來容納引用字符串的內存。這會立即發生段錯誤。

0

字符串文字是常數,即它們不能改變。您還試圖將較長的字符串複製到較短的字符串中,該字符串將寫入超出目標字符串的範圍。

這兩個問題都會導致未定義的行爲這可能會導致崩潰。


要解決第一個問題,您必須爲目標字符串使用數組。要解決其他問題,您必須確保目標數組至少爲至少與源字符串(包括其終止'\0')一樣大。

+0

我明白了。我的遞歸函數是否適用於那些不是字符串文字的?我主要關注的是遞歸地編寫一個有效的strcpy函數。 – Bonnie 2013-03-20 07:03:42

+0

@邦尼只有目標需要是一個數組。 – 2013-03-20 07:06:26

1

您正在嘗試修改常量字符串。這是錯誤的!修改常量字符串時,段錯誤的機會可能會生效。一行內

char s[10] = "Bob"; 
    char t[10] = "Billy"; 
    char *ptr; 
+1

因爲這確實是第一個問題而被投票,儘管這種改變會立即引發第二個問題:'s'沒有't'那麼多的存儲空間,所以副本將會寫入緩衝區的末尾。 – rra 2013-03-20 07:01:29

+0

@ H2CO3謝謝 - 我修改了程序 – 2013-03-20 07:02:06

+0

@Aniket不客氣。 – 2013-03-20 07:03:01

3

恭喜你,你已經調用未定義行爲兩次:

而是做到這一點。

首先,您不能修改字符串文字的內容。所以strcpy() ing "foo"是錯誤的。

二,即使你可以:你正在複製一個字符串到比字符串短的緩衝區。這又是UB。