我有一個名爲遊戲用等級的陣列結構,這樣定義:分割故障問題(C)
typedef struct
{
Level levels[x];
} Game;
當我編譯的代碼,如果x是1,2或3,該程序運行一般。如果它有任何其他值(例如4),則會出現分段錯誤。我沒有在任何地方訪問數組。主目前是這樣的(評論除了初始化以外的所有內容):
int main (...)
{
Game g;
return 0;
}
任何線索可能是什麼?
在此先感謝。
我有一個名爲遊戲用等級的陣列結構,這樣定義:分割故障問題(C)
typedef struct
{
Level levels[x];
} Game;
當我編譯的代碼,如果x是1,2或3,該程序運行一般。如果它有任何其他值(例如4),則會出現分段錯誤。我沒有在任何地方訪問數組。主目前是這樣的(評論除了初始化以外的所有內容):
int main (...)
{
Game g;
return 0;
}
任何線索可能是什麼?
在此先感謝。
多大是Level
?你有可能溢出你的堆棧嗎?鑑於有(顯然)永遠只能一個遊戲對象,無論如何,也許你會更好使用static
存儲類,如:static Game g;
編輯:
如果要強制在堆上分配,我建議使用
糟糕 - 錯過了它被標記爲C,而不是C++。std::vector<Level> levels;
而不是直接使用指針。
我同意他可能溢出堆棧,但問題不在於C++ :) – 2010-05-14 16:43:30
或者您可以將g的聲明移到main()函數之外。 – 2010-05-14 17:32:48
感謝您的建議。我只使用了靜態,因爲我只有一個對象,並且可以這樣工作。該程序沒有在我的電腦上導致分段錯誤,但是它導致了我當時使用的那個(它真的很舊,所以可能是問題)。級別是一個大班級,但我認爲它不會造成分段錯誤。 – user228938 2010-05-14 22:05:59
如果級別類/結構是非常大的,你可以嘗試使用這樣的:
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);
}
在我的機器,這個代碼
typedef struct {
char data[65536*4];
} Level;
typedef struct
{
Level levels[4];
} Game;
int main (...)
{
Game g;
return 0;
}
崩潰,雖然它不如果我將levels
陣列的大小更改爲3
,那就不行了。
您應該(通過把在堆上,而不是堆棧數據)或將在堆上的水平降低Level
類型的大小(以保持他們在指針數組動態分配Level
對象) 。
你也可以讓全球級別。它可能不是以這樣的方式使用,那將是一個問題。 – nategoose 2010-05-14 17:57:32
如果你確實擁有你的數據的大小,並堅持讓它分配棧,也許可以在鏈接器上設置堆棧大小。如果我錯了請糾正我,因爲我覺得這個話題有趣
通常情況下,在類似的情況下,你必須聲明靜態變量:
int main(void) {
static struct foo bar[SIZE];
return 0;
}
這樣的變量將被分配在編譯插入靜態區域時間。
就靜態分配而言,我們可以看看「level」是什麼,或者至少它的大小?我有一個預感它的巨大。 – 2010-05-14 16:45:11