在嵌套结构上使用 free 会使程序崩溃

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

我最近正在探索 C 的所有 oop 特性,当我遇到这个问题时。我想用 C 创建一个游戏引擎,所以我使用嵌套结构来组织所有东西。但是当释放内存时,程序崩溃了。我知道我可能在代码中犯了一个错误,但如果有人能解释这个问题,那真的会对我有帮助。

这是代码:

#include <stdio.h>
#include <stdlib.h>

struct Outer
{
    int Var;
    struct Inner
    {
        int Var;
    }*inner;
};




int Init(struct Outer *outer)
{
    outer = (struct Outer*) malloc(sizeof(struct Outer));
    outer->inner = (struct Inner*) malloc(sizeof(struct Inner));
    if(outer == NULL || outer->inner == NULL){printf("fail1\n");return 1;}
printf("Sucess1\n");
return 0;
}

int Exit(struct Outer *outer)
{
    if(outer != NULL)
    {
        printf("outer is null\n");
        if(outer->inner != NULL)
        {
            printf("inner is null");
            free(outer->inner);
        }
        free(outer);
    }
    
    
    if(outer != NULL || outer->inner != NULL){printf("fail2\n");return 1;}
printf("Sucess2\n");
return 0;
}


int main()
{
    struct Outer *outer;

    Init(outer);

    outer->Var = 1;
    outer->inner->Var = 2;

    Exit(outer);

printf("terminated");
return 0;
}

输出只有:

Sucess1

我原以为内存会正常释放,但正如你所看到的,程序没有到达终点。

c struct free
1个回答
0
投票

C 中的参数是按值传递的。 这意味着当

outer
传递给
Init
时,对函数内参数所做的任何更改在函数外部都看不到。

这意味着

outer
Init
返回后保持未初始化状态,并且对其进行后续操作会触发代码中的 未定义行为,导致其崩溃。

更改

Init
函数以返回分配的指针:

struct Outer *Init()
{
    // don't cast the return value of malloc and perform error check right away
    struct Outer *outer = malloc(sizeof(struct Outer));
    if(outer == NULL) {
        printf("fail1\n");
        return NULL;
    }

    outer->inner = malloc(sizeof(struct Inner));
    if(outer->inner == NULL) {
        printf("fail1a\n");
        return NULL;
    }
    printf("Sucess1\n");
    return outer;
}

并更改调用以分配结果:

outer = Init();
© www.soinside.com 2019 - 2024. All rights reserved.