SDL2开发C游戏时realloc第三次分配内存崩溃求助
问题分析与修复
你的程序崩溃的核心原因是内存分配错误,具体体现在以下几个关键点:
1. 内存分配尺寸计算错误
在addEntity函数中,你使用sizeof(entityArr.entities)计算元素大小,但entityArr.entities是指针类型(Entity*),仅占4/8字节(32/64位系统),而Entity结构体实际大小远大于此(8个int + 1个指针,总计约40字节)。这导致每次分配的内存不足以容纳Entity实例,第二次添加实体时触发缓冲区溢出,直接崩溃。
2. 重复调用realloc且未正确使用临时指针
你先通过tmp获取realloc结果,确认成功后却再次调用realloc赋值给entityArr.entities,这不仅冗余,还可能导致内存泄漏或指针失效(若第二次realloc失败)。
3. 实体数组初始化错误
在main函数中,calloc(1, sizeof(Entity*))分配的是指针空间,而非Entity结构体空间,初始内存就不符合需求。
修复后的代码
修正addEntity函数
void addEntity(Entity *entity) { printf("Inside addEntity function\n"); // 检查是否需要扩容(容量管理) if (entityArr.size >= entityArr.cap) { // 初始容量设为2,之后每次扩容翻倍 int new_cap = entityArr.cap == 0 ? 2 : entityArr.cap * 2; Entity *tmp = realloc(entityArr.entities, new_cap * sizeof(Entity)); if (!tmp) { printf("Could not allocate memory for entity in array\n"); return; } entityArr.entities = tmp; entityArr.cap = new_cap; } // 将实体拷贝到数组末尾 entityArr.entities[entityArr.size] = *entity; entityArr.size++; printf("The entity %d has been added to the array!\n", entityArr.size); }
修正main中的数组初始化
int main(int argc, char **argv) { memset(&app, 0, sizeof(App)); memset(&player, 0, sizeof(Entity)); // 正确初始化实体数组:初始无内存,大小为0,容量为0 entityArr.entities = NULL; entityArr.size = 0; entityArr.cap = 0; initSDL(); // ... 其余代码保持不变 ... }
关键修复说明
- 正确计算内存尺寸:使用
sizeof(Entity)代替sizeof(entityArr.entities),确保为每个Entity结构体分配足够内存。 - 合理的容量管理:通过
cap字段跟踪数组容量,当元素数量达到容量时自动扩容(每次翻倍),避免频繁调用realloc。 - 安全使用
realloc:仅调用一次realloc,用临时指针tmp验证分配结果,成功后再更新数组指针,防止内存泄漏或指针失效。 - 正确初始化数组:初始时将
entities设为NULL,size和cap设为0,后续通过realloc动态分配内存。
这些修复会解决第二次按R键崩溃的问题,同时优化内存管理的安全性和效率。
内容的提问来源于stack exchange,提问作者Artiom Kvartiuk
相关产品推荐
相关产品推荐

