2 Stimmen

Die Ausgabe spuckt zwei zusätzliche Steuerzeichen aus, möglicherweise ein Fehler im Speicher?

Ich habe das folgende Programm test.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;
}

Ich baue es mit:

g++ -g -c -o test.o test.cc; g++ -static-libgcc -o test test.o

Verwendung von g++ Version 3.4.6

Ich habe es durch valgrind laufen lassen und es wird nichts als falsch gemeldet.

Die Ausgabe enthält jedoch zwei zusätzliche Steuerzeichen und sieht wie folgt aus:

....

Das ist ein Kontroll-X und ein Kontroll-G am Ende.

Wenn Sie den Wert von bogus2 ändern, erhalten Sie andere Steuerzeichen. Wenn Sie die Anzahl der Punkte im Array ändern, verschwindet das Problem oder ändert sich.

Ich vermute, dass es sich um einen Fehler im Compiler oder im iostream-Paket handelt, der den Speicher beschädigt.

Was ist hier eigentlich los?

9voto

schnaader Punkte 47961

In C/C++ wird eine Zeichenkette normalerweise als null-terminiertes char-Array gespeichert.

Ihr unsigned char-Array ist nicht null-terminiert. Normalerweise würde es etwa so aussehen:

unsigned char bogus1[] = {
  0x2e, 0x2e, 0x2e, 0x2e,
  0x00 // terminating NUL byte
};

Wenn es nicht null-terminiert ist, wird die Ausgabe fortgesetzt, bis ein NUL-Byte gefunden wird. Deshalb werden Werte ausgegeben, die sich im Speicher hinter dem Array befinden, wie z.B. der int bogus2 (der 0x00000718 in hex ist, gespeichert im little endian Format => 0x18 = Ctrl-X, 0x07 = Ctrl-G, 0x00 beendet die Ausgabe)

8voto

Sie verpassen die '\0' am Ende der Zeichenkette

unsigned char bogus1[] = {
  0x2e, 0x2e, 0x2e, 0x2e, 0x00
};

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X