2013-06-26 41 views
2

我不太明白這裏發生了什麼。這是非常簡單的代碼:C++未修改的布爾數組更改(OS X)

#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 

我無法解釋這一點,但我想必須有一些非常簡單的解釋。

謝謝!

證明:

enter image description here

+0

提示:輸出您正在寫入的數組索引 – PlasmaHH

+0

另外,爲什麼'int n = N'?考慮當'N'持有大於'int'的值時可以保持。只需使用一個無符號類型(來匹配你的模板參數),並從99%的其他循環中計數0。 :) – GManNickG

+0

感謝您的意見。愚蠢的錯誤。是的,更好,我同意。謝謝! – o1iver

回答

4

你寫,並從該數組的邊界課外閱讀等有未定義行爲

請記住,大小爲N的數組的索引從0N - 1

+0

Sla頭!謝謝!將在8分鐘內接受:) – o1iver