0

我将值作为字符串添加到组合框中。下面是我的代码。

平台 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() );
}

各位大佬能不能给个思路,我不明白什么?

4

4 回答 4

3

itoa()zero-terminate 它的输出,所以当你调用itoa(63, char[2], 10)它时,它会写三个字符63\0. 但是您的缓冲区只有两个字符长。

itoa()函数最好避免使用snprintf()or boost::lexical_cast<>()

于 2012-09-05T14:57:35.857 回答
0

您正在将整数转换为 ASCII,就是itoa这样。如果你有一个像 183 这样的数字,它是四个字符的字符串,'1','8','3','\0'。

每个字符占用一个字节,例如字符 '1' 是 ASCII 中的值 0x31。

于 2012-09-05T14:57:04.483 回答
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 个字节,您试图将其塞入一个两字节数组中。文档专门告诉您确保缓冲区足够大以容纳任何值;在这种情况下,它应该至少是 long中的位数max_num_of_high_sats,加上终止 null 的位数。

您不妨让它足够大以容纳可以存储在无符号整数中的最大值,即 11(例如,4294967295 的 10 位数字加上终止的空值)。

于 2012-09-05T15:01:40.033 回答
0

the ito function is used to convert a int to a C sytle string based on the 3rd parameter base. As a example, it just likes to print out the int 63 in printf. you need two ASII byte, one is used to storage CHAR 6, the other is used to storage CHAR 3. the 3rd should be NULL. So in your case the max int is three digital. you need 4 bytes in the string

于 2012-09-05T15:01:42.357 回答