来自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不计),但摆在首位的目标数组正确归零,所以一切都很好.
| 归档时间: |
|
| 查看次数: |
9785 次 |
| 最近记录: |