GCC - memcpy自动复制空字符?

Raf*_*mal 1 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);
Run Code Online (Sandbox Code Playgroud)

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

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

Ker*_* SB 12

拼图中的关键因素是初始化器"".这与以下内容相同:

char str1[20] = { 0 };
Run Code Online (Sandbox Code Playgroud)

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

char str1[20] = { };
Run Code Online (Sandbox Code Playgroud)

要么

char str1[20] = { 0, 0, 0, ..., 0 };   // 20 times
Run Code Online (Sandbox Code Playgroud)

所有这些初始化器初始化数组以保持20个零.

memcpy调用并不会复制空终止(因为strlen不计),但摆在首位的目标数组正确归零,所以一切都很好.

  • @Rafi:C99,6.7.8.21*"如果括号括起的列表中的初始值设定项少于聚合的元素或成员,或者用于初始化已知大小的数组的字符串文字中的字符数少于**是数组**中的元素,聚合的其余部分应与具有静态存储持续时间的对象隐式初始化."*具有静态存储持续时间的对象是零初始化的. (3认同)