将 unsigned char 附加到向量会更改其值

Appending an unsigned char to a vector changes its value

我有以下二维向量:

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;
}

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

addDay 是 return 指向超出范围的堆栈变量的指针;调用者访问它时指针无效。

如果你想让它工作,用 std::arraystd::vector(或 std::tuple,给定位置可能具有独立于存储值的意义)替换 C 风格数组。

最小的变化类似于:

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
}

您将 return 值用于:

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;