2017-05-26 50 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 *)'。 –