Přetečení vyrovnávací paměti
Různé velikosti znaků mohou způsobit potíže, pokud umístíte znaky do vyrovnávací paměti. Vezměme si následující kód, který kopíruje znaky z řetězce sz do vyrovnávací paměti rgch:
cb = 0;
while( cb < sizeof( rgch ) )
rgch[ cb++ ] = *sz++;
Otázkou je: Byl poslední bajt zkopírován vedoucím bajtem? Tímto není problém vyřešen, protože může potenciálně přetéct vyrovnávací paměť:
cb = 0;
while( cb < sizeof( rgch ) )
{
_mbccpy( rgch + cb, sz );
cb += _mbclen( sz );
sz = _mbsinc( sz );
}
_mbccpy volání pokusí udělat správnou věc – znak úplně zkopírovat, jestli je 1 nebo 2 bajty. Neberte ale v úvahu, že zkopírování posledního znaku nemusí vyhovovat vyrovnávací paměti, pokud je znak široky 2 bajty. Správným řešením je:
cb = 0;
while( (cb + _mbclen( sz )) <= sizeof( rgch ) )
{
_mbccpy( rgch + cb, sz );
cb += _mbclen( sz );
sz = _mbsinc( sz );
}
Tento kód přetečení vyrovnávací paměti je možný při zkoušce smyčky, pomocí _mbclen testování velikosti současného znaku ukazuje na sz. Voláním _mbsnbcpy funkce, můžete nahradit kód ve while smyčce s jedním řádkem kódu. Příklad:
_mbsnbcpy( rgch, sz, sizeof( rgch ) );