如何将值存储在char中

how values are stored in char

本文关键字:char 存储      更新时间:2023-10-16

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

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

你们能给我一个我不理解的想法吗?

itoa()零终止其输出,因此当您调用itoa(63, char[2], 10)时,它会写入三个字符63和终止的。但是您的缓冲区只有两个字符长。

最好避免CCD_ 6函数而选择CCD_ 7或CCD_。

您应该阅读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",再加上一个终止的null字符。这是4个字节,您正试图将其填充到一个两字节的数组中。文档特别告诉你要确保你的缓冲区足够大,可以容纳任何值;在这种情况下,它应该是至少max_num_of_high_sats长度中的位数,加上终止null的一。

您还可以将其设置为足够大,以容纳可以存储在无符号int中的最大值,该值为11(例如,4294967295的10位数字加上终止null)。

ito函数用于将int转换为基于第三个参数库的C字符串。例如,它只是喜欢在printf中打印出int 63。您需要两个ASII字节,一个用于存储CHAR6,另一个用于保存CHAR3。第三个应该为NULL。所以在你的情况下,最大int是三个数字。字符串 中需要4个字节

您正在将整数转换为ASCII,这就是itoa的作用。如果您有一个像183这样的数字,它是四个字符组成的字符串,则为"1"、"8"、"3"、"\0"。

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