2016-10-26 90 views
0

我很難將值放入我的結構數組中。使用單個結構它可以正常工作,但是一旦我創建了它們的陣列,就會出現「分段錯誤(核心轉儲)」錯誤。我通過一個調試器運行了這段代碼,它說段落錯誤是在readFilefseek(fp,0L,SEEK_END)處引起的。如果我刪除與任何內存分配有關的變量,則錯誤將簡單轉移到該行中的下一個變量。將值放入結構數組中嗎?

我敢肯定,這與我如何將值放入結構數組中有關。

我正在使用的方法將我需要的值放入結構數組中。

我意識到這段代碼真的很粗糙,我只是想在清理之前得到一個工作模型。

+0

當你的'depend'有兩個維度時,你爲什麼只能訪問'data [x] .depend [x]'?我的意思是,那不是你的問題,但可能是無意的。 – Magisch

+0

'parseData'的大小是3MB。 'struct parseData data [5000]'從你的堆棧中獲取15GB。你有足夠的內存嗎? – Holger

回答

0

如果錯誤出現在fseek(fp,0L,SEEK_END);中,您可能尚未打開該文件或者在打開該文件時發生錯誤。

您是否檢查了從fp=fopen(...);返回的不是NULL

您尚未發佈最低可驗證完整示例(MVCE),因此很難提供很多幫助。

https://stackoverflow.com/help/mcve

0
struct parseData { 
    char rules[1000][1000]; 
    char depend[1000][1000]; 
    char commands[1000][1000]; 
}; 

struct parseData data[5000]; 

parseData需要3MB這些3 2維陣列,所以需要data的存儲器15GB。這高於堆棧限制(取決於編譯器,通常大約爲10MB或100MB)。您的代碼表明,該陣列可以如下降低:

struct parseData 
{ 
    char rules[1000][50]; 
    char depend[1000][50]; 
}; 
... 
struct parseData data[1000]; 

data仍然需要的內存,這可能仍超過堆棧限制100MB。因此您應該在堆上聲明data

struct parseData data[1000]; 
int main() 
{ 
    ... 
} 

你也可以寫使用realloc一個小的測試程序,這可以讓你加量的內存在運行時,這樣你就不會需要一個巨大的緩衝。