尺寸如何与memcpy一起使用?

时间:2014-07-26 23:50:38

标签: c++ arrays memcpy

我的问题与以下代码的安全性有关:

#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:数组,否则它使用初始方法。

1 个答案:

答案 0 :(得分:4)

字符串常量的其余部分被忽略,好像它不在那里。 memcpy一旦达到size字节,就会停止。

请注意,尽管将大于size的内存块传递给memcpy是安全的,但传递较短的块会触发未定义的行为。例如,如果您传递少于九个字符的string,则memcpy会将字符串末尾的无效字符复制到myArray