В вывод выводятся два дополнительных управляющих символа, возможно, ошибка с повреждением памяти? - PullRequest
2 голосов
/ 22 мая 2010

У меня есть следующая программа 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;
}

Я строю это с:

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

Использование g ++ версии 3.4.6

Я провожу его через valgrind и ничего не сообщается неправильно.

Однако вывод имеет два дополнительных управляющих символа и выглядит следующим образом:

....

Это control-X и control-G в конце.

Если вы измените значение bogus2, вы получите разные управляющие символы. Если вы измените количество периодов в массиве, проблема исчезнет или изменится.

Я подозреваю, что это ошибка повреждения памяти в пакете компилятора или iostream.

Что здесь происходит?

Ответы [ 2 ]

9 голосов
/ 22 мая 2010

В C / C ++ строка обычно хранится как массив символов с нулевым символом в конце.

Ваш массив unsigned char не заканчивается нулем. Обычно это будет выглядеть примерно так:

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

Если он не завершен нулем, вывод будет продолжаться до тех пор, пока не будет найден байт NUL, поэтому он выводит значения, которые помещаются в память за вашим массивом, например, int bogus2 (это 0x00000718 в шестнадцатеричном виде, хранящийся в формат с прямым порядком байтов => 0x18 = Ctrl-X, 0x07 = Ctrl-G, 0x00 завершает вывод)

8 голосов
/ 22 мая 2010

Вам не хватает '\0' в конце строки

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