假设我确实喜欢这样复制字符串。
char str[] = "";
char *str2 = "abc";
strcpy(str, str2);
printf("%s", str); // "abc"
printf("%d", strlen(str)); // 3
然后,为什么它没有给我未定义的行为或导致程序失败。这样做有什么缺点?
您正在写入堆栈上分配给 str 的内存空间。你需要确保你有正确的 str 空间。在您提到的示例中,您需要为 a、b 和 c 加上一个空字符来结束字符串,所以这段代码应该可以工作:
char str[4];
char *str2 = "abc";
strcpy(str, str2);
printf("%s", str); // "abc"
printf("%d", strlen(str)); // 3
此代码肯定会导致堆栈问题,尽管使用这么小的字符串,您看不到问题。举个例子:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char str[] = "";
char *str2 = "A really, really, really, really, really, really loooooooooooooooonnnnnnnnnnnnnnnnng string.";
strcpy(str, str2);
printf("%s\n", str);
printf("%d\n", strlen(str));
return 0;
}
一个人为的例子,是的,但是运行它的结果是:
A really, really, really, really, really, really loooooooooooooooonnnnnnnnnnnnnnnnng string.
92
Segmentation fault
这是不鼓励使用 strcpy 函数的原因之一,建议使用需要指定所涉及字符串大小的复制和连接函数。
它实际上给了你未定义的行为,但你的程序不必因此而失败。这就是未定义行为的工作原理。