将无符号字符附加到向量会更改其值

Posted

技术标签:

【中文标题】将无符号字符附加到向量会更改其值【英文标题】:Appending an unsigned char to a vector changes its value 【发布时间】:2020-12-10 02:38:09 【问题描述】:

我有以下二维向量:

vector<vector<unsigned char>> dates;

我还有以下无符号字符数组:

unsigned char date[3] = 1, 18, 108;

当我将 push_back 这个数组设置为 dates 时,它会将所有 unsigned char 元素设置为 204:

date = ADP::addDay(date);
cout << int(date[0]) << '-' << int(date[1]) << '-' << int(date[2]) << endl;
dates.push_back( date[0], date[1], date[2] );
cout << int(date[0]) << '-' << int(date[1]) << '-' << int(date[2]) << endl;

输出:

1-18-108
204-204-204

我在这里缺少什么吗?我认为这是将 char 转换为 ASCII 的问题,但我真的不确定。

编辑

addDay() 看起来像这样:

unsigned char* addDay(unsigned char datep[3]) 
unsigned char date[3];
date[0] = datep[0];
date[1] = datep[1];
date[2] = datep[2];
... modifys date ...
return date;

所以它返回一个指针。这可能是一个问题吗?

【问题讨论】:

您能否在edit 您的问题中包含minimal reproducible example - 我们可以编译和运行以重现问题的代码? 在online compiler 上试一试,你确定你的输出没有什么意外吗? 我不知道是什么导致了这个问题。当我在另一个文件上运行时,我没有遇到问题。我真的不知道什么是足够的代码来发布。我希望有人能看到我的程序的结构并看到一个可能的问题。 【参考方案1】:

addDay 正在返回一个指向超出范围的堆栈变量的指针;调用者有权访问指针时指针无效。

如果您希望它起作用,请将 C 样式数组替换为 std::arraystd::vector(或 std::tuple,因为该位置的意义可能与存储的值无关)。

最小的变化是这样的:

std::tuple<unsigned char, unsigned char, unsigned char> addDay(unsigned char datep[3]) 
    // Same code as before
    return date[0], date[1], date[2];  // C++17; on earlier versions, use std::make_tuple

您可以将返回值用于:

auto datetup = ADP::addDay(date);
cout << int(std::get<0>(date)) << '-' << int(std::get<1>(date)) << '-' << int(std::get<2>(date)) << endl;

或者使用漂亮的名称和结构化的绑定:

auto [year, month, day] = ADP::addDay(date);
cout << int(year) << '-' << int(month) << '-' << int(day) << endl;

【讨论】:

以上是关于将无符号字符附加到向量会更改其值的主要内容,如果未能解决你的问题,请参考以下文章

套接字:将无符号字符数组从 C 传递到 JAVA

如何将无符号字符数组解析为数值数据

将无符号字符读入字符串

如何以优雅有效的方式将无符号/有符号整数/长整数转换为 C 字符串?

创建 Java 实用函数以将无符号字符数组转换为字符串

如何将无符号字符数组存储为浮点值?