将 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::array
或 std::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;
我有以下二维向量:
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::array
或 std::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;