【发布时间】:2018-05-13 18:21:43
【问题描述】:
在用 C 语言设计游戏实体系统时,我尝试了一种“equals-free”初始化方法。我很惊讶地看到一个 linter 告诉我在我的 init 函数结束时存在内存泄漏,并且我的变量 ent 从未在以下代码中初始化。结果证明是对的,因为我遇到了“总线错误”:
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int x;
int y;
} entity_t;
void entity_init(entity_t* ent, int _x, int _y)
{
ent = malloc(sizeof(*ent));
ent->x = _x;
ent->y = _y;
}
int main(void)
{
entity_t* ent;
entity_init(ent, 10, 24);
printf("Entity: x%d y%d", ent->x, ent->y);
return 0;
}
我认为上面的代码会做的是将我的空ent 指针作为参数提供,告诉它指向一些新分配的内存,然后填充该内存和所有内容会好的。我不知道导致“总线错误”的真正原因是什么,我是否遗漏了一些关于指针和 malloc 的关键信息?
我模糊地记得之前在一些 C 代码中看到过与此非常相似的东西(equals-free 结构初始化),我强烈希望使用类似于此的 equals-free 初始化样式(损坏) 代码 if 这样的事情在 C 中是可能的。
【问题讨论】:
-
ent = malloc(sizeof(*ent));覆盖传递的函数参数。结束。剩下的就是main中的内存泄漏和未定义的行为。疯狂 -entity_t* ent;甚至还没有被初始化为NULL,所以它甚至可能在不中断的情况下做一些奇怪的事情。 -
@WeatherVane 再次...
-
更改时,在子函数中,调用函数中指针指向的地方,子函数的参数必须是指针的地址。在当前场景下,调用应该是:
entity_init( &ent, 10, 24);,签名应该是:void entity_init(entity_t** ent, int _x, int _y) -
在编写变量、参数和宏名称时,不要使用前导下划线。前导下划线,尤其是后跟大写字母时,是为操作系统“保留”的。
-
关于:
ent = malloc(sizeof(*ent));始终检查 (!=NULL) 返回值以确保操作成功。
标签: c pointers struct malloc bus-error