You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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();

    // ... 其余代码保持不变 ...
}

关键修复说明

  1. 正确计算内存尺寸:使用sizeof(Entity)代替sizeof(entityArr.entities),确保为每个Entity结构体分配足够内存。
  2. 合理的容量管理:通过cap字段跟踪数组容量,当元素数量达到容量时自动扩容(每次翻倍),避免频繁调用realloc。
  3. 安全使用realloc:仅调用一次realloc,用临时指针tmp验证分配结果,成功后再更新数组指针,防止内存泄漏或指针失效。
  4. 正确初始化数组:初始时将entities设为NULL,size和cap设为0,后续通过realloc动态分配内存。

这些修复会解决第二次按R键崩溃的问题,同时优化内存管理的安全性和效率。

内容的提问来源于stack exchange,提问作者Artiom Kvartiuk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 13:20:55