c - GCC - memcpy 自动复制空字符?

标签 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 字符初始化字符串。

最佳答案

谜题的关键成分是初始化器""。这等同于:

char str1[20] = { 0 };

这又等同于(至少在 GCC 中,并且总是在 C++ 中):

char str1[20] = { };

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

所有这些初始化程序都将数组初始化为包含 20 个零。

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

关于c - GCC - memcpy 自动复制空字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12518463/

相关文章:

c - 创建多个子项的代码中的问题

objective-c - 以编程方式获取 Mac 上所有正在运行的进程的列表

linux - gcc-4.7 与 Debian 8 杰西

c - 相同的代码 (C) 无法在终端上运行,但可以在 IDE 上运行

c++ - GCC:使用旧 C 代码时出现链接器错误

c - 替代 container_of()

c - C中构造函数和析构函数的命名约定

C:将二维数组分配给另一个数组

c++ - 它是 C++ gcc HEAD 10.0.0 20190 相对于友元函数的错误吗

c - 将文件分成相等的部分,每个部分 128 字节