Добавление беззнакового символа к вектору изменяет его значение

У меня есть следующий 2D-вектор:

vector<vector<unsigned char>> dates;

У меня также есть следующий массив беззнаковых символов:

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

Когда я push_back задаю этот массив dates, он устанавливает для всех беззнаковых элементов 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;
}

поэтому он возвращает указатель. Может ли это быть возможной проблемой?

Можете ли вы отредактировать свой вопрос, включив в него минимальный воспроизводимый пример — код, который мы можем скомпилировать и запустить, чтобы воспроизвести проблему?

1201ProgramAlarm 10.12.2020 03:52

попробуйте на онлайн-компиляторе, ничего неожиданного, вы уверены в своем выводе?

George Zheng 10.12.2020 04:03

Я понятия не имею, что вызывает проблему. Когда я запускаю другой файл, я не понимаю проблемы. Я действительно не знаю, какой код достаточно для публикации. Я надеюсь, что кто-то увидит структуру моей программы и увидит возможную проблему.

brickbobed 10.12.2020 04:36
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
239
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

addDay возвращает указатель на переменную стека, которая выходит за пределы области видимости; указатель недействителен в тот момент, когда вызывающая сторона имеет к нему доступ.

Замените массивы в стиле C на std::array или std::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;

Другие вопросы по теме