2013-11-22 106 views
0

我真的很新的C和東西纏着我...C中的數組的內存分配

我宣佈一個typedef:

typedef struct{ 
     double 
      real, 
      img; 
    }complex; 

而且,在函數內部,我聲明如下數組:

complex system[MAX_NODES+1][MAX_NODES+2]; 

的第一件事情與該陣列的元件的功能不被初始化,但是,如果應用程序將運行期間編譯和崩潰,除非具有相同尺寸的另一陣列和類型也DECL ARED(即使不使用它):

complex system1[MAX_NODES+1][MAX_NODES+2], 
    complex system[MAX_NODES+1][MAX_NODES+2]; 

這使我相信這是內存的問題,也許第一個系統分配了所需的內存...是這樣嗎?如果是這樣,爲什麼?

MAX_NODES是一個常量設置爲300,所以我認爲數組聲明已經分配內存......我應該實際使用malloc嗎?

不管怎麼說,宣佈系統靜態似乎解決了問題:

static complex system[MAX_NODES+1][MAX_NODES+2]; 

我只是不知道爲什麼......我知道一個靜態變量內的功能,使該變量在隨後的保值函數調用,但是這與內存有什麼關係或者這個問題是什麼?有小費嗎?

非常感謝。

+1

你的代碼聽起來很合理。你能給出更多的上下文嗎?是否有可能嘗試訪問超出其範圍的數組(例如,在函數之外)? – happydave

+3

需要顯示真實的,可編譯的代碼 - 包括初始化。 – Rob

+1

這個問題幾乎必須在你的初始化函數中。我認爲我們需要看到它。那之後運行 – Baldrick

回答

2

您的代碼:

for (lines = 0; lines <= MAX_NODES+1; lines++) 
{ 
    for (columns = 0; columns <= MAX_NODES+2; columns++){ 

應該是

for (lines = 0; lines < MAX_NODES+1; lines++) 
{ 
    for (columns = 0; columns < MAX_NODES+2; columns++){ 

你被1否則過沖既數組維度 - 因此存儲器錯誤。

+2

對於OP的信息 - 它與額外的數組或靜態「工作」的事實只是一個巧合(雖然很容易解釋)。 – keltar

+2

不是巧合:它「工作」,因爲額外的數組提供了一個緩衝區 - 堆棧上的額外內存沒有被使用,並且可以「合法」訪問。由於它在編譯時被分配,沒有指針被覆蓋,一切都很好。 – Floris

+0

非常感謝,就是這樣:) 不過,你能說爲什麼靜態變量顯然能解決問題嗎? – Costagero