出力は、2つの余分な制御文字、おそらくメモリの破損バグを吐き出しますか?

StackOverflow https://stackoverflow.com/questions/2889074

  •  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
};
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top