-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;
}

我这样做只是为了练习,但是当我编译它时。我从主那里得到了一个段错误。有人能告诉我是什么导致了这个段错误吗?

4

4 回答 4

3

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

首先,您不能修改字符串文字的内容。所以strcpy()ing on"foo"是错误的。

第二,即使你可以:你正在将一个字符串复制到一个比字符串短的缓冲区。这又是UB。

于 2013-03-20T07:01:00.583 回答
1

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

而是这样做:

  char s[10] = "Bob";
  char t[10] = "Billy";
  char *ptr;
于 2013-03-20T07:00:25.760 回答
0

您不能覆盖用于保存带引号的字符串的内存。那会立即出现段错误。

于 2013-03-20T06:59:34.307 回答
0

字符串文字是常量,即它们不能改变。您还尝试将较长的字符串复制到较短的字符串中,这将超出目标字符串的范围。

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


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

于 2013-03-20T06:59:56.430 回答