我可以在空字符串中复制字符串吗?

假设我喜欢这样来复制字符串。

char str[] = ""; char *str2 = "abc"; strcpy(str, str2); printf("%s", str); // "abc" printf("%d", strlen(str)); // 3 

然后,为什么它不会给我未定义的行为或导致程序失败。 这样做的缺点是什么?

这段代码肯定会导致堆栈问题,尽管有这么小的字符串,你没有看到问题。 举个例子,如下:

 #include  #include  #include  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函数的原因之一,建议使用需要指定所涉及字符串大小的复制和连接函数。

您正在写入堆栈上分配给str的内存空间。 您需要确保str具有正确的空间量。 在你提到的例子中,你需要a,b和c的空间加上一个空字符来结束字符串,所以这段代码应该工作:

 char str[4]; char *str2 = "abc"; strcpy(str, str2); printf("%s", str); // "abc" printf("%d", strlen(str)); // 3 

它实际上为您提供了未定义的行为,但您的程序不必因此而失败。 这就是未定义行为的工作原理。