gpt4 book ai didi

c++ - memcpy 行为异常

转载 作者:太空宇宙 更新时间:2023-11-04 08:51:27 25 4
gpt4 key购买 nike

下面是我的示例代码:

int function1(unsigned char *out, int length){
unsigned long crypto_out_len = 16;
unsigned char crypto_out[16] = {0};
.......
//produces 16 bytes output & stores in crypto_out
crypto_function(crypto_out, crypto_out_len);
//lets say crypto_output contents after are : "abcdefghijklmnop"
.......
memcpy(out, crypto_out,length);
return 0;
}

function2(){
unsigned char out[10] = {0};
function1(out, 10);
std::pair<unsigned char *,int> map_entry;
map_entry.first = out;
map_entry.second = 10;
}

现在,map_entry.first 应该包含:“abcdefghij”,对吗?

但它包含“abcdefghij#$%f1^”,一些与之相关的垃圾。我应该如何避免这种意外行为,以便 map_entry.first 应该恰好包含“abcdefghij”。

最佳答案

由于您没有粘贴整个代码,我不能 100% 确定,但我想我知道哪里出了问题。 memcpy()在这里行为正确,一切都是 100% 定义的行为。

在这种情况下,out是一个 10 个字符的字符串,没有 空终止符。您将其分配给 unsigned char*不包含长度信息,我怀疑您在提到 map_entry.first 时根本没有使用数字 10 .

如果将其打印为 unsigned char*或者构造一个 std::string有了它,C++ 期望它是一个以 null 结尾的字符串。因此,它一直读取到第一个空字符。现在,自 out没有它只是运行并开始读取 out 之后堆栈上的字符这恰好是您认为的垃圾。

您需要做的是,确保或者字符串以 null 结尾,或者确保您始终引用它并指定正确的长度。对于前者,您需要制作 out 11 字节长,最后一个字节保留为 0 :

function2(){
unsigned char out[11] = {0};
function1(out, 10);
std::pair<unsigned char *,int> map_entry;
map_entry.first = out;
map_entry.second = 10;
}

另请注意,C++ 实际上会在遇到第一个空字符时停止。如果你的crypto_function()可能会在字符串中间输出零字节,您应该知道字符串将在该点被截断。

对于后者,您必须使用实际允许您指定字符串长度的函数,并且始终传递 10 的长度。对那些。如果你总是这样使用它,你就不必担心来自 crypto_function() 的零字节。 .

关于c++ - memcpy 行为异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19556716/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com