Я добавляю значения в поле со списком в виде строки. Ниже мой код.
Платформа 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() );
}
Не могли бы вы, ребята, дать мне представление о том, чего я не понимаю?
itoa()
обнуляет его вывод, поэтому, когда вы звоните itoa(63, char[2], 10)
это пишет три символа 6
, 3
и заканчивая \0
, Но ваш буфер длиной всего два символа.
itoa()
Функция лучше избегать в пользу snprintf()
или же boost::lexical_cast<>()
,
Вы должны прочитать документацию для 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 плюс завершающий ноль).
функция ito используется для преобразования int в строку типа Си на основе базы 3-го параметра.
Например, ему просто нравится распечатывать int 63 в printf. вам нужно два байта ASII, один используется для хранения CHAR 6, другой используется для хранения CHAR 3. третий должен быть NULL. Так что в вашем случае макс. Int — это три цифровых. вам нужно 4 байта в строке
Вы конвертируете целое число в ASCII, вот что itoa
делает. Если у вас есть число, например 183, то есть четыре символа в виде строки, «1», «8», «3», «\ 0».
Каждый символ занимает один байт, например, символ «1» — это значение 0x31 в ASCII.