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

时间:2013-07-11 17:04:19

标签: c string

假设我这样做是为了复制字符串。

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

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

3 个答案:

答案 0 :(得分:4)

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

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

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

答案 2 :(得分:2)

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