2016-03-13 52 views
1

簡單的代碼分配的價值結構的領域,也改變其他變量

#include <iostream> 
using namespace std; 

struct foo { 
    int bar; 
}; 
struct foo tab[2]; 

int sum = 0; 

int main() 
{ 
    tab[2].bar = 3; //this change 'sum' value! 
    cout << sum << endl; 
    return 0; 
} 

結果中的3而不是0令人不可思議的是,這樣problably我失去了一些東西。我做錯了什麼?

+0

數組訪問超出範圍。看到[這裏](http://www.slideshare.net/GiorgiMoniava/introduction-to-undefined-behavior-in-c-and-c)瞭解更多信息。 –

回答

3

數組從0開始,因此tab [2]將是第三個元素,但您只分配了其中的2個元素。

在這種情況下,sum總是在tab後面的內存中,所以當你到達第三個tab時,你實際上就在內存中求和。

1

請注意,您訪問tab[2]這是一個溢出(其大小爲2,因此有效索引爲0和1)。 因此tab[2]訪問sum的內存地址。

1

當你聲明的變量

struct foo tab[2]; 

tab[2]不存在。 你只能做

tab[0].bar = 3 

tab[1].bar = 3 

因爲數組索引從開始和結束arraySize-1

1

如果仔細觀察,標籤的長度爲2.通過訪問索引2,您正在訪問內存中的標籤,這意味着您正在訪問總和。

這就是你改變總和的原因。

0

首先,打開編譯器警告!如果你讓編譯器幫你的話,那就很可能指出確切的錯誤在這行:

tab[2].bar = 3; //this change 'sum' value! 

根據您所使用的編譯器,警告可能如下:

warning: array subscript is above array bounds 

struct foo tab[2];與索引0和1兩個元素,您嘗試訪問一個不存在的第三個元素。這導致您的程序的未定義行爲。無論結果如何,它都是隨機的。你的程序也可能隨機崩潰。


請注意,您的代碼也是一半C和一半C++。這不好。當您想要參考foo類型時,您不需要編寫struct foo,這足以編寫foo。可以使用std::array<Foo, 2>而不是原始數組。 using namespace std;不應該被默認使用。