代码之家  ›  专栏  ›  技术社区  ›  WilliamKF

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

  •  2
  • WilliamKF  · 技术社区  · 14 年前

    我有以下程序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 回复  |  直到 12 年前
        1
  •  9
  •   schnaader    14 年前

    在C/C++中,字符串通常被存储为空终止字符数组。

    您的无符号字符数组不是以空结尾的。通常看起来像这样:

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

    如果不是以空结尾,输出将继续,直到找到一个nul字节,这就是为什么它输出放在数组后面的内存中的值,如in t bogus2(十六进制为0x00000718,以小尾数格式存储=&g t;0x18=ctrl-x,0x07=ctrl-g,0x00结束输出)

        2
  •  8
  •   BlueRaja - Danny Pflughoeft    14 年前

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

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