GCC - memcpy自动复制空字符?

时间:2012-09-20 18:15:42

标签: c gcc

cplusplus.com关于memcpy:“该函数不检查源中的任何终止空字符 - 它总是复制num字节。”

所以下面的代码应该给出运行时错误,不是吗?

char str1[20] = "";
char str2[20] = "Another Text---";

memcpy(str1, str2, strlen(str2));
printf("%s\n%s", str1, str2);

但是我总是使用我的gcc编译器从这段代码中获得正确的输出。这是否意味着memcpy实际上从str2的末尾复制了空字符,或者它只是一个随机的情况?

编辑:我与str1[20] = "A"的行为相同,因为有些答案指出str1[20] = ""正在使用所有NULL字符初始化字符串。

4 个答案:

答案 0 :(得分:11)

谜题中的关键因素是初始化器""。这与:

相同
char str1[20] = { 0 };

这又与(至少在GCC中,并且始终在C ++中)相同:

char str1[20] = { };

char str1[20] = { 0, 0, 0, ..., 0 };   // 20 times

所有这些初始值设定项都会初始化数组以保存20个零。

memcpy调用复制空终止符(因为strlen不计算它),但目标数组首先正确归零,一切都很好。

答案 1 :(得分:1)

memcpy正在复制strlen(str2)(这并不意味着将空字节复制)从str2到str1的字节。由于str1中有足够的空间可以使用很多字节。 memcpy将内存完全复制

如果您尝试将超过20的任何内容从一个复制到另一个,则会出现错误。你不应该在两个变量中存储超过19个字符。

正如kerrek解释的那样,它也可以帮助你将str1初始化为null,因为你不必担心在这种特定情况下的空终止。

答案 2 :(得分:1)

你告诉它要复制strlen(str2)个字符数,这恰好是字符串的长度(空索引)。

与使用strcpy()相同。它试图说的是,如果你需要来复制NULL,你可以使用memcpy,因为strcpy()会在它找到的第一个空值处停止。

答案 3 :(得分:0)

使用字符串大于 str1初始化str2并再次尝试,然后您会看到它不会复制null。你很幸运str1零填充。我更改了代码以显示输出对str1的内容的依赖性:

#include <stdio.h>
#include <string.h>

int main()
{
    char str1[20] = "xxxxxxxxxxxxxxxxxxx";
    char str2[20] = "Another Text---";

    memcpy(str1, str2, strlen(str2));
    printf("%s\n%s", str1, str2);

    return 0;
}

输出将是:

Another Text---xxxx
Another Text---