出力は、2つの余分な制御文字、おそらくメモリの破損バグを吐き出しますか?
-
04-10-2019 - |
質問
次のプログラムテストがあります。cc:
#include <iostream>
unsigned char bogus1[] = {
// Changing # of periods (0x2e) changes output after periods.
0x2e, 0x2e, 0x2e, 0x2e
};
unsigned int bogus2 = 1816; // Changing this value changes output.
int main()
{
std::clog << bogus1;
}
私はそれを構築します:
g++ -g -c -o test.o test.cc; g++ -static-libgcc -o test test.o
G ++バージョン3.4.6の使用
私はそれをValgrindで実行しますが、何も間違っていません。
ただし、出力には2つの追加の制御文字があり、次のようになります。
....
それは最後のコントロールXとコントロール-Gです。
bogus2の値を変更すると、異なるコントロール文字が得られます。配列内の期間数を変更すると、問題がなくなるか、変更されます。
コンパイラまたはiOSTREAMパッケージのメモリ腐敗バグだと思います。
ここで何が起こっているのですか?
解決
C/C ++では、文字列は通常、ヌル終端のcharアレイとして保存されます。
署名されていないチャーアレイはヌル終了しません。通常、それは次のようになります:
unsigned char bogus1[] = {
0x2e, 0x2e, 0x2e, 0x2e,
0x00 // terminating NUL byte
};
nullが終了していない場合、nulバイトが見つかるまで出力は継続されます。そのため、int bogus2(hexの0x00000718はリトルエンド形式で保存されているように、アレイの後ろのメモリに配置された値を出力します。 => 0x18 = ctrl-x、0x07 = ctrl-g、0x00は出力を終了します)
他のヒント
あなたはありません '\0'
文字列の終わりに
unsigned char bogus1[] = {
0x2e, 0x2e, 0x2e, 0x2e, 0x00
};
所属していません StackOverflow