2013-02-12 60 views
-1

我寫了這段代碼,但輸出結果並不是我所期望的。我將整數:proj.startP設置爲1000,但在執行一些for循環後,該變量再次設置爲0結構中的整數設置爲零

#include <stdio.h> 

struct vezelstruct{ 
    float verd[10][10][10]; 
    int startP; 
}; 

struct vezelstruct proj; 

int main(int argc, char *argv[]) 
{ 
    int g, i; 

    proj.startP=1000;       // variable set to 1000 
    printf("%i\n", proj.startP); 

    for(g=1;g<=10;g++) 
    { 
     for(i=1;i<=10;i++){ 
       proj.verd[g][10][i]=0.0; 
     } 
    } 

    printf("should be 1000: %i\n", proj.startP); // it's equal to 0 here 
    return 0; 
} 

我在做什麼錯在這裏?

+4

索引從0開始!!! – nhahtdh 2013-02-12 08:05:03

回答

3

這裏:for(g=1;g<=10;g++)在這裏:for(i=1;i<=10;i++)你應該從0開始和結束9,即for(i = 0; i < 10; i++)

當您嘗試訪問proj.verd[10][10][10]時,實際上是嘗試訪問數組範圍之外的內存。導致未定義的行爲,在這種情況下導致重寫proj.startP0

+0

寫出來的習慣寫法是「我<10」,而不是「我<= 9」。沒有理由讓代碼更難閱讀。 – Art 2013-02-12 08:13:08

+0

@藝術:你是對的。我只想在這裏強調數字'9'。 – LihO 2013-02-12 08:14:31

+0

奧克,thanx很多! – 2013-02-12 08:18:27

1

你已經飛越你的數組,併成功進入undefined behavior的領域,在你的情況下,它已經覆蓋了結構的其他成員。正確的代碼應該是:

for(g=0;g<10;g++) 
{ 
     for(i=0;i<10;i++){ 
       proj.verd[g][9][i]=0.0; 
     } 
} 
1

看起來像你超出了你的數組邊界並將值設置爲零。如果你從0到9而不是1到10,它應該工作。

0

當您跨越數組邊界的限制時,編譯器會嘗試替換分配給您的堆棧的其他部分中的值。如果它跨越棧的邊界,那麼你會遇到分段錯誤。這裏因爲你試圖訪問比數組邊界更多的數據,所以它把0放在proj.startP中。

+0

如果您添加報價以支持您的答案,情況會更好 – yuan 2013-02-12 13:37:18