我最近正在探索 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 中的参数是按值传递的。 这意味着当
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();