2017-05-26 53 views
0

我試圖讀取文件中的數據,但收到STATUS_STACK_BUFFER_OVERRUN錯誤並且應用程序崩潰。讀取文件時字符緩衝區溢出

我有一個結構:

struct BSPEntities 
{ 
    char* ents; 
}; 

而且我讀文件:

BSPEntities entities 
ifstream mapfile; 
int size = 54506; 
int offset = 5182600; 

entities.ents = new char[size]; 
mapfile.seekg(offset, ios::beg); 
mapfile.read((char *)(&entities.ents), size); 

「大小」和「抵消」從文件加載和已知值是有效的。我有預處理器指令#pragma pack(1)和#pragma圍繞BSPEntities結構。

謝謝。

+0

爲什麼使用原始的新? –

回答

2

&entities.ents是指向char的指針。指向的對象(指向char的指針)可能只有4或8個字節,具體取決於您定位的體系結構,但是您正試圖向其寫入54,506個字節。很明顯,54,506大於8,所以你寫過指針的末尾,行爲是未定義的。

,上面寫着應該只是mapfile.read(entities.ents, size);

你也不必更動#pragma pack這裏,除非有更復雜的東西會在你沒有展示。

+0

好的,謝謝你的問題。我現在感到很傻。我正在使用pack和push,因爲當我讀取文件時,VS會填充結構並給出錯誤的結果。 – Hermetix

+0

@Hermetix你不直接讀取數據到結構本身,所以struct padding是不相關的。 –

1
mapfile.read((char *)(&entities.ents), size); 

應該

mapfile.read(entities.ents, size); 

不是傳遞堆內存塊ents點,要傳遞的ents本身地址的地址。由於ents正被分配到堆棧上,因此您正在讀取堆棧中的字節,直到其超出。

+1

只需注意你不需要在那裏投射'(char *)'。 –