读取文件时字符缓冲区溢出

Character buffer being overrun while reading file

本文关键字:缓冲区 溢出 字符 文件 读取      更新时间:2023-10-16

我正在尝试从文件中读取数据,但收到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);
">

size"和"offset"是从文件加载的值,已知有效。我有预处理器指令 #pragma pack(1( 和 #pragma 推动 BSPEntities 结构。

谢谢。

&entities.ents是指向字符的指针。 指向的对象(指向 char 的指针(可能只有 4 或 8 个字节,具体取决于您要面向的体系结构,但您尝试向其写入 54,506 个字节。 显然,54,506 大于 8,因此您正在写入指针的末尾,并且行为未定义。

这种解读应该只是mapfile.read(entities.ents, size);

此外,您不需要在这里弄乱#pragma pack,除非有更复杂的事情发生,而您没有显示。

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

应该是

mapfile.read(entities.ents, size);
传递的

不是传递ents指向的堆内存块的地址,而是传递ents本身的地址。由于ents是在堆栈上分配的,因此您将字节读取到堆栈上,直到它溢出。