Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 大小如何与memcpy协同工作?_C++_Arrays_Memcpy - Fatal编程技术网

C++ 大小如何与memcpy协同工作?

C++ 大小如何与memcpy协同工作?,c++,arrays,memcpy,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); 现在,如果字符串短于10个字符,它会用零填充std:array,否则它将使用initial方法。字符串常量的其余部分将被忽略,就像它不在

我的问题涉及以下代码的安全性:

#define ARRAY_SIZE 10

std::array<BYTE, ARRAY_SIZE> myArray;
char* string = "this_sentence_is_longer_than_10_bytes"

memcpy(&myArray, string, ARRAY_SIZE);

现在,如果字符串短于10个字符,它会用零填充std:array,否则它将使用initial方法。

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


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

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


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

@quantdev您是对的,我将
字节
名称作为其面值。谢谢,关于“预填充”的任何建议字符*数组是否太短?是的,BYTE只是unsigned char:)@user1539405您不能填充数组-这里唯一的选择是为
大小传递一个较小的值(显然,如果没有足够的数据,您不需要填充整个数组)。在我的第一篇文章中添加了一个编辑。这看起来对吗?我用零填充了初始数组,然后传递了较小的数组大小,这样就不会留下较旧的数据。@user1539405是的,您更新的代码是安全的。您可以通过保存strlen的结果,并使用而不是创建和复制新数组来提高效率。@quantdev您是对的,我将
字节
名称视为其面值。谢谢,如果char*数组太短,有没有关于“预填充”char*数组的建议?是的,BYTE只是unsigned char:)@user1539405您不能填充数组-这里唯一的选择是为
大小传递一个较小的值(显然,如果没有足够的数据,您不需要填充整个数组)。在我的第一篇文章中添加了一个编辑。这看起来对吗?我用零填充了初始数组,然后传递了较小的数组大小,这样就不会留下较旧的数据。@user1539405是的,您更新的代码是安全的。您可以通过保存strlen的结果,并使用而不是创建和复制新数组来提高效率。为什么要使用
memcpy
?在C++中,使用<代码> STD::复制< /COD>(或<代码> STD::CopyOnn)。BTW,应该是“代码> const char字符串……而且如果编译器没有告诉您,它被配置错误。为什么代码< MeMCPY ?在C++中,使用<代码> STD::复制< /COD>(或<代码> STD::CopyOnn)。BTW,应该是“代码> const char字符串……而且如果编译器没有告诉您,它是错误配置的。
#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);
}