来自 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/