从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字符初始化字符串。
答案 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---