第三次重新分配内存时,C 程序崩溃

问题描述 投票:0回答:1

我正在学习 SDL2 用 c 语言制作一个简单的游戏。我编写了一些代码将实体存储在一个数组中,以便我可以循环它们以渲染和移动它们。每当我按 R 时,它就会发射子弹。如果我第二次按 R 键,窗口就会关闭,它会执行一次。这是代码:

typedef struct {
    int x;
    int y;
    int w;
    int h;
    int up;
    int down;
    int left;
    int right;
    SDL_Texture *texture;
} Entity;

typedef struct {
    Entity *entities;
    int size;
    int cap;
} EntityArray;

EntityArray 实体Arr;

void addEntity(Entity *entity)
{
    printf("Inside moveEntity function\n");
    printf("The tmp pointer is %d bytes\n", (entityArr.size+1)*sizeof(entityArr.entities));
    Entity *tmp = (Entity*)realloc(entityArr.entities,(entityArr.size+1)*sizeof(entityArr.entities)); // crashes here whenever I allocate more than 16 bytes
    if(!tmp)
    {
        printf("Could not allocate memory for entity in array");
        free(tmp);
        return;
    }
    entityArr.entities = realloc(entityArr.entities, (entityArr.size+1)*sizeof(entityArr.entities));
    entityArr.size++;
    //memcpy((entityArr.entities+(entityArr.size-1)), entity, sizeof(Entity));
    (*(entityArr.entities+(entityArr.size-1))) = (*entity);
    printf("The entity %d has been added to the array!\n", entityArr.size);
}
int main(int argc, char **argv)
{
    memset(&app, 0, sizeof(App));
    memset(&player, 0, sizeof(Entity));
    //memset(&entityArr, 0, sizeof(EntityArray));

    entityArr.entities = calloc(1, sizeof(Entity*)); 
    entityArr.size = 0;
    entityArr.cap = 0;

    initSDL();

    player.x = 100;
    player.y = 100;
    player.w = 64;
    player.h = 64;
    player.texture = loadTexture("assets/textures/player.png");

    printf("Player entity initialized at address: %p\n", &player);
    
    bullet.x = player.x;
    bullet.y = player.y;
    bullet.w = 16;
    bullet.h = 16;
    bullet.up = 1;
    bullet.texture = loadTexture("assets/textures/bullet.png");
    if(bullet.texture)
    {
        printf("The bullet texture has been defined\n");
    } else {
        printf("The bullet texture has not been defined\n");
    }

    addEntity(&player);


    atexit(cleanUp);

    while (1)
    {
        prepareScene();

        doInput();

        moveEntity(&entityArr.entities);

        blitEntity(entityArr.entities);

        presentScene();

        SDL_Delay(16);
    }

    return 0;
}

每当我尝试重新分配超过 16 个字节时,它就会崩溃

我尝试使用记忆功能,但此时我已经筋疲力尽,不知道自己在做什么

c memory-management dynamic-arrays
1个回答
0
投票

一旦您在 tmp 中获得了新的内存块,您只需将其分配给实体字段即可。第一次成功后无需进行第二次重新分配。

void addEntity(Entity *entity)
{
    printf("Inside moveEntity function\n");
    printf("The tmp pointer is %d bytes\n", (entityArr.size+1)*sizeof(entityArr.entities));
    Entity *tmp = (Entity*)realloc(entityArr.entities,(entityArr.size+1)*sizeof(entityArr.entities)); // crashes here whenever I allocate more than 16 bytes
    if(!tmp)
    {
        printf("Could not allocate memory for entity in array");
        free(tmp);
        return;
    }
    entityArr.entities = tmp;
    entityArr.size++;
    //memcpy((entityArr.entities+(entityArr.size-1)), entity, sizeof(Entity));
    (*(entityArr.entities+(entityArr.size-1))) = (*entity);
    printf("The entity %d has been added to the array!\n", entityArr.size);
}
© www.soinside.com 2019 - 2024. All rights reserved.