как значения хранятся в char

Я добавляю значения в поле со списком в виде строки. Ниже мой код.

Платформа Windows XP и я использую Microsoft Visual Studio 2003

язык C ++

обнаружена ошибка -> «Ошибка проверки времени выполнения № 2 — стек вокруг переменной« буфер »поврежден».

Если я увеличу размер буфера до 4 и выше, я не получу эту ошибку.

Мой вопрос не связан с тем, как исправить эту ошибку, но мне интересно, почему я получил эту ошибку, если размер буфера = 2.

Согласно моей логике я дал размер буфера = 2, так как char [0] будет хранить клапан char [1] = символ с нулевым символом в конце.

Теперь, когда char может хранить значения от 0 до 255, я подумал, что все должно быть в порядке, поскольку мои вставленные значения составляют от 1 до 63, а затем от 183 до 200.

CComboBox m_select_combo;
const unsigned int max_num_of_values = 63;

m_select_combo.AddString( "ALL" );

for( unsigned int i = 1; i <= max_num_of_values ; ++i )
{
char buffer[2];
std::string prn_select_c = itoa( i, buffer, 10 );
m_select_combo.AddString( prn_select_c.c_str() );
}

const unsigned int max_num_of_high_sats = 202 ;

for( unsigned int i = 183; i <= max_num_of_high_sats ; ++i )
{
char buffer[2];
std::string prn_select_c = itoa( i, buffer, 10 );
m_select_combo.AddString( prn_select_c.c_str() );
}

Не могли бы вы, ребята, дать мне представление о том, чего я не понимаю?

0

Решение

itoa() обнуляет его вывод, поэтому, когда вы звоните itoa(63, char[2], 10) это пишет три символа 6, 3 и заканчивая \0, Но ваш буфер длиной всего два символа.

itoa() Функция лучше избегать в пользу snprintf() или же boost::lexical_cast<>(),

3

Другие решения

Вы должны прочитать документацию для itoa,

Рассмотрим следующий цикл:

for( unsigned int i = 183; i <= max_num_of_high_sats ; ++i )
{
char buffer[2];
std::string prn_select_c = itoa( i, buffer, 10 );
m_select_combo.AddString( prn_select_c.c_str() );
}

Первая итерация преобразует целое число 183 к строке из 3 символов «183» плюс завершающий нулевой символ. Это 4 байта, которые вы пытаетесь втиснуть в двухбайтовый массив. Документы специально говорят вам, чтобы убедиться, что ваш буфер достаточно велик, чтобы содержать любое значение; в этом случае это должно быть по крайней мере количество цифр в max_num_of_high_sats long плюс один для завершающего нуля.

Вы также можете сделать его достаточно большим, чтобы в нем содержалось максимальное значение, которое вы можете хранить в беззнаковом int, которое будет равно 11 (например, 10 цифр для 4294967295 плюс завершающий ноль).

0

функция ito используется для преобразования int в строку типа Си на основе базы 3-го параметра.
Например, ему просто нравится распечатывать int 63 в printf. вам нужно два байта ASII, один используется для хранения CHAR 6, другой используется для хранения CHAR 3. третий должен быть NULL. Так что в вашем случае макс. Int — это три цифровых. вам нужно 4 байта в строке

0

Вы конвертируете целое число в ASCII, вот что itoa делает. Если у вас есть число, например 183, то есть четыре символа в виде строки, «1», «8», «3», «\ 0».

Каждый символ занимает один байт, например, символ «1» — это значение 0x31 в ASCII.

0