我将值作为字符串添加到组合框中。以下是我的代码。
平台 Windows XP和我正在使用 Microsoft Visual Studio 2003
语言 C ++
遇到错误 - > “运行时检查失败#2 - 变量'缓冲区'周围的堆栈已损坏。”
如果我将缓冲区的大小增加到4以上,那么我就不会收到此错误。
我的问题与如何解决该错误无关,但我想知道为什么如果缓冲区大小= 2,我会收到此错误。
根据我的逻辑,我给缓冲区大小= 2,因为char [0]将存储char [1] = null终止字符的阀门。
现在,由于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 :(得分:3)
itoa()
将其输出置零,因此当您致电itoa(63, char[2], 10)
时,它会写入三个字符6
,3
和终止\0
。但是你的缓冲区只有两个字符长。
itoa()
函数,以支持snprintf()
或boost::lexical_cast<>()
。
答案 1 :(得分:0)
您正在将整数转换为ASCII,这是itoa
的作用。如果你有一个像183这样的数字作为一个字符串的四个字符,'1','8','3','\ 0'。
每个字符占用一个字节,例如字符“1”是ASCII中的值0x31。
答案 2 :(得分:0)
您应该阅读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
长的位数,加上一个用于终止空值。
你也可以使它足够大,以保存你可以存储在unsigned int中的最大值,即11(例如,对于4294967295加上一个终止空值为10位)。
答案 3 :(得分:0)
ito函数用于根据第3个参数库将int转换为C sytle字符串。 例如,它只是打印出printf中的int 63。你需要两个ASII字节,一个用于存储CHAR 6,另一个用于存储CHAR 3.第三个应该是NULL。所以在你的情况下,max int是三位数字。你需要字符串中的4个字节