2

我不太明白这里发生了什么。这是非常简单的代码:

#include <iostream>
#include <sstream>

using std::endl;
using std::cout;
using std::string;
using std::ostringstream;

template <unsigned int N>
struct byte_t {
    bool bits[N];
    byte_t() {
        for (int n = N; n > 0; n--)
            bits[n] = false;
        cout << "Created " << N << "-bit byte: " << str() << endl;
    }
    string dstr() {
        ostringstream ss;
        for (int n = N; n > 0; n--)
            if (bits[n] == true) ss << '1';
            else                 ss << '0';
        return ss.str();
    }
    string str() {
        ostringstream ss;
        for (int n = N; n > 0; n--)
            ss << bits[n];
        return ss.str();
    }
};

int main(int argc,char** argv) {
    byte_t<8> my_byte;
    cout << my_byte.str() << endl;
    cout << my_byte.str() << endl;
    cout << my_byte.dstr() << endl;
    return 0;
}

现在这是预期的结果,以及 IDEOne 上的结果(请参阅http://ideone.com/JL0m4R):

Created 8-bit byte: 00000000
00000000
00000000
00000000

编译后在我的mac(10.8.4)上奇怪的是

g++ -o byte byte.cc

这是我得到的输出:

Created 8-bit byte: 00000000
00000000
240000000
10000000

我无法解释这一点,但我想一定有一些非常简单的解释。

谢谢!

证明:

在此处输入图像描述

4

1 回答 1

4

您正在数组边界之外写入和读取,因此具有未定义的行为

请记住,大小数组的N索引从0N - 1

于 2013-06-26T20:26:28.450 回答