Ausgang spuckt zwei zusätzliche Steuerzeichen, die möglicherweise einen Speicherfehler Fehler?

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

  •  04-10-2019
  •  | 
  •  

Frage

Ich habe folgendes 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

Mit g ++ Version 3.4.6

Ich betreibe es durch valgrind und nichts falsch berichtet.

Doch der Ausgang hat zwei zusätzliche Steuerzeichen und sieht wie folgt aus:

....

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

Wenn Sie den Wert von bogus2 ändern erhalten Sie verschiedene Steuerzeichen. Wenn Sie die Anzahl der Perioden im Array ändern das Problem weggeht oder Änderungen.

Ich vermute, es ist ein Speicherfehler auf Fehler im Compiler oder iostream-Paket.

Was ist denn hier los?

War es hilfreich?

Lösung

in C / C ++, eine Zeichenkette in der Regel als eine mit Null beendete char Array gespeichert ist.

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

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

Wenn es nicht null-terminiert ist, ausgegeben wird fortgesetzt, bis ein NUL-Byte gefunden wird, das ist, warum es Werte gibt, die im Speicher hinter dem Array platziert werden, wie die int bogus2 (die 0x00000718 in hex ist, gespeichert in little-endian-Format => 0x18 = Strg-X, 0x07 = Ctrl-G, 0x00 Enden des Ausgang)

Andere Tipps

Sie verpassen die '\0' am Ende der Zeichenfolge

unsigned char bogus1[] = {
  0x2e, 0x2e, 0x2e, 0x2e, 0x00
};
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top