我的问题与以下代码的安全性有关:
#define ARRAY_SIZE 10
std::array<BYTE, ARRAY_SIZE> myArray;
char* string = "this_sentence_is_longer_than_10_bytes"
memcpy(&myArray, string, ARRAY_SIZE);
结果:myArray已填充[0-9]
"this_sente"
就安全而言,我需要知道&#39;字符串&#39;的其余部分。是否由于给定的大小而完全被忽略,还是被抛出数组末尾?
编辑: 我现在有
#define ARRAY_SIZE 10
std::array<BYTE, ARRAY_SIZE> myArray;
char* string = "this_sentence_is_longer_than_10_bytes"
if (strlen(string) < ARRAY_SIZE)
{
BYTE clearArray[ARRAY_SIZE] = {0};
memcpy(&myArray, clearArray, ARRAY_SIZE);
memcpy(&myArray, string, strlen(string));
}
else
{
memcpy(&myArray, string, ARRAY_SIZE);
}
如果字符串短于10个字符,它现在用零填充std:数组,否则它使用初始方法。
答案 0 :(得分:4)
字符串常量的其余部分被忽略,好像它不在那里。 memcpy
一旦达到size
字节,就会停止。
请注意,尽管将大于size
的内存块传递给memcpy
是安全的,但传递较短的块会触发未定义的行为。例如,如果您传递少于九个字符的string
,则memcpy
会将字符串末尾的无效字符复制到myArray
。