输出吐出两个额外的控制字符,可能是内存损坏错误?

Wil*_*mKF 2 c++ iostream memory-corruption

我有以下程序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;
}
Run Code Online (Sandbox Code Playgroud)

我建立它:

g++ -g -c -o test.o test.cc; g++ -static-libgcc -o test test.o
Run Code Online (Sandbox Code Playgroud)

使用g ++版本3.4.6

我通过valgrind运行它,没有任何报告错误.

但是输出有两个额外的控制字符,如下所示:

....
Run Code Online (Sandbox Code Playgroud)

那是最后的控制-X和控制-G.

如果更改bogus2的值,则会得到不同的控制字符.如果更改数组中的句点数,问题就会消失或发生变化.

我怀疑它是编译器或iostream包中的内存损坏错误.

这里发生了什么?

sch*_*der 9

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

unsigned char数组不以null结尾.通常它看起来像这样:

unsigned char bogus1[] = {
  0x2e, 0x2e, 0x2e, 0x2e,
  0x00 // terminating NUL byte
};
Run Code Online (Sandbox Code Playgroud)

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


Blu*_*eft 8

你错过'\0'了字符串的末尾

unsigned char bogus1[] = {
  0x2e, 0x2e, 0x2e, 0x2e, 0x00
};
Run Code Online (Sandbox Code Playgroud)