我有以下程序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软件包中的内存损坏错误。

这里发生了什么?

最佳答案

在C / C++中,字符串通常存储为以null结尾的char数组。

您的无符号字符数组不是以空值结尾的。通常情况如下:

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

如果不是以Null结尾,则输出将一直持续到找到NUL字节为止,这就是为什么它输出放置在数组后面的内存中的值的原因,例如int bogus2(十六进制的0x00000718,以小尾数格式存储) => 0x18 = Ctrl-X,0x07 = Ctrl-G,0x00结束输出)

08-16 19:53