2011-11-12 170 views
2

我有這個函數需要512個頂點的數組。 (每個包含x,y,z座標)。無論如何,我犯了一個錯誤,而不是訪問數組512次,我做了513次。而不是「零」,我得到了一個數字。我再次運行它,一樣。我再次增加了迭代和相同的事情。即使我超出了數組的極限,隨機值每次都顯示出函數。這些價值是什麼?我可以訪問OS中的任何內容嗎? (這可能聽起來很愚蠢,但對於C++和指針來說是新的)奇怪的陣列行爲

void print_facet_array(FACET3 *f) 
{ 
    int i=0; 
    for (i=0;i<=513;i++) 
    { 
     printf("The vertices (x,y,z) for facet %d are: V_1 = x:%f , y:%f, z:%f. \n", i, f[i].p1.x, f[i].p1.y, f[i].p1.z); 
     printf("The vertices (x,y,z) for facet %d are: V_2 = x:%f , y:%f, z:%f. \n", i, f[i].p2.x, f[i].p2.y, f[i].p2.z); 
     printf("The vertices (x,y,z) for facet %d are: V_3 = x:%f , y:%f, z:%f. \n", i, f[i].p3.x, f[i].p3.y, f[i].p3.z); 
    } 

} 

回答

4

實際上,你的循環要經過514次。所以你通過2

超限C中的數組超速/ C++是完全不確定的行爲。任何事情都可能發生(崩潰,錯誤的數據)。

在你的情況,你可能閱讀棧或堆的垃圾 - 它可以是任何東西。

0

C和C++不支持數組邊界檢查。與Java不同的是,訪問超出其合法範圍的數組將導致顯示異常,C++允許訪問。總之,恭喜;你已經創建了骰子(一個隨機數發生器)。

你到達終點後,你看到的值是什麼恰好是在內存中的最後一個元素之後。它可能是一箇舊變量,另一個變量,或者僅僅是來自未初始化的內存塊的垃圾。

+3

不管你做什麼,**不要**使用該隨機數發生器。 – Pubby

4

在其邊界以外訪問數組會導致Undefined Behavior
未定義的行爲意味着任何事情都可能發生,並且所有安全投注都關閉。

所以這些值可以是任何東西真的,它們存在於這是不保留您的array.They可能屬於其他一些有效的變量可能或不是一些內存位置值。

只記得NEVER訪問數組元素超越其邊界。

既然你開始學習C++,這應該是一個良好的閱讀:
What every c programmer should know about Undefined Behavior.