#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得到了一个段错误。有人能告诉我这可能导致这个段错误吗?
答案 0 :(得分:3)
恭喜,您已在一行内调用未定义的行为两次。
首先,您无法修改字符串文字的内容。因此,strcpy()
"foo"
是错误的。
两,即使你可以:你将字符串复制到比字符串短的缓冲区。这又是UB。
答案 1 :(得分:1)
您正在尝试修改常量字符串。这是错的!修改常量字符串时会出现段错误的可能性。
而是这样做:
char s[10] = "Bob";
char t[10] = "Billy";
char *ptr;
答案 2 :(得分:0)
您无法覆盖用于保存带引号字符串的内存。这会立即发生错误。
答案 3 :(得分:0)
字符串文字是常量,即它们无法改变。您还尝试将较长的字符串复制到较短的字符串中,该字符串将写入超出目标字符串的边界。
这两个问题都会导致未定义的行为,从而导致崩溃。
要解决第一个问题,必须使用数组作为目标字符串。要解决其他问题,您必须确保目标数组至少与源字符串一样大(包括其终止'\0'
)。