2013-03-20 147 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。