2010-05-14 151 views
6

我有一個名爲遊戲用等級的陣列結構,這樣定義:分割故障問題(C)

typedef struct 
{ 
    Level levels[x]; 
} Game; 

當我編譯的代碼,如果x是1,2或3,該程序運行一般。如果它有任何其他值(例如4),則會出現分段錯誤。我沒有在任何地方訪問數組。主目前是這樣的(評論除了初始化以外的所有內容):

int main (...) 
{ 
    Game g; 

    return 0; 
} 

任何線索可能是什麼?

在此先感謝。

+3

就靜態分配而言,我們可以看看「level」是什麼,或者至少它的大小?我有一個預感它的巨大。 – 2010-05-14 16:45:11

回答

4

多大是Level?你有可能溢出你的堆棧嗎?鑑於有(顯然)永遠只能一個遊戲對象,無論如何,也許你會更好使用static存儲類,如:static Game g;

編輯: 如果要強制在堆上分配,我建議使用 std::vector<Level> levels;而不是直接使用指針。 糟糕 - 錯過了它被標記爲C,而不是C++。

+2

我同意他可能溢出堆棧,但問題不在於C++ :) – 2010-05-14 16:43:30

+0

或者您可以將g的聲明移到main()函數之外。 – 2010-05-14 17:32:48

+0

感謝您的建議。我只使用了靜態,因爲我只有一個對象,並且可以這樣工作。該程序沒有在我的電腦上導致分段錯誤,但是它導致了我當時使用的那個(它真的很舊,所以可能是問題)。級別是一個大班級,但我認爲它不會造成分段錯誤。 – user228938 2010-05-14 22:05:59

5

如果級別類/結構是非常大的,你可以嘗試使用這樣的:

typedef struct { 
    Level *levels; 
} Game; 

,然後使用malloc()或新分配好自己的水平。或者,如果你真的需要水平的數組:

typedef struct { 
    Level* levels[NUM_LEVELS]; 
} Game; 

然後用這樣的分配水平:

// Allocate levels 
int i; 
for(i=0;i<NUM_LEVELS;i++) { 
    gameStruct.levels[i] = (Level*)malloc(sizeof(Level)); 
    initLevelNum(gameStruct.levels[i], i); 
} 
4

在我的機器,這個代碼

typedef struct { 
    char data[65536*4]; 
} Level; 

typedef struct 
{ 
    Level levels[4]; 
} Game; 

int main (...) 
{ 
    Game g; 

    return 0; 
} 

崩潰,雖然它不如果我將levels陣列的大小更改爲3,那就不行了。

您應該(通過把在堆上,而不是堆棧數據)或將在堆上的水平降低Level類型的大小(以保持他們在指針數組動態分配Level對象) 。

+0

你也可以讓全球級別。它可能不是以這樣的方式使用,那將是一個問題。 – nategoose 2010-05-14 17:57:32

0

如果你確實擁有你的數據的大小,並堅持讓它分配棧,也許可以在鏈接器上設置堆棧大小。如果我錯了請糾正我,因爲我覺得這個話題有趣

0

通常情況下,在類似的情況下,你必須聲明靜態變量:

int main(void) { 
    static struct foo bar[SIZE]; 

    return 0; 
} 

這樣的變量將被分配在編譯插入靜態區域時間。