递归strcpy函数

时间:2013-03-20 06:57:41

标签: c string recursion strcpy

#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得到了一个段错误。有人能告诉我这可能导致这个段错误吗?

4 个答案:

答案 0 :(得分:3)

恭喜,您已在一行内调用未定义的行为两次。

首先,您无法修改字符串文字的内容。因此,strcpy() "foo"是错误的。

两,即使你可以:你将字符串复制到比字符串短的缓冲区。这又是UB。

答案 1 :(得分:1)

您正在尝试修改常量字符串。这是错的!修改常量字符串时会出现段错误的可能性。

而是这样做:

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

答案 2 :(得分:0)

您无法覆盖用于保存带引号字符串的内存。这会立即发生错误。

答案 3 :(得分:0)

字符串文字是常量,即它们无法改变。您还尝试将较长的字符串复制到较短的字符串中,该字符串将写入超出目标字符串的边界。

这两个问题都会导致未定义的行为,从而导致崩溃。


要解决第一个问题,必须使用数组作为目标字符串。要解决其他问题,您必须确保目标数组至少与源字符串一样大(包括其终止'\0')。