Ausgang spuckt zwei zusätzliche Steuerzeichen, die möglicherweise einen Speicherfehler Fehler?
-
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?
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
};