为什么这个 C 结构体初始化代码会产生总线错误?

累加器

在用 C 设计游戏实体系统时,我尝试了一种“平等自由”的初始化方法。我很惊讶地看到 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 struct 初始化),如果在 C 中可能出现这种情况,我强烈希望使用类似于此(损坏的)代码的 equals-free 初始化样式.

普科奇克

malloc调用移到初始化函数之外:

#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->x = _x;
    ent->y = _y;
}

int main(void)
{
    entity_t* ent;
    if(NULL==(ent = malloc(sizeof(*ent))))
        return 1;
    entity_init(ent, 10, 24);
    printf("Entity: x%d y%d", ent->x, ent->y);
    return 0;
}

您将指向已分配块的指针分配给局部变量 (ent)。这不会影响entin main

如果您想保留mallocin entity_init,您应该使用双指针,但您还应该更改签名以允许一种方式来mallocentity_init

int entity_init(entity_t **ent, int _x, int _y)
{
    if(NULL==(*ent = malloc(sizeof(**ent))))
        return -1;
    (*ent)->x = _x;
    (*ent)->y = _y;
}

int main(void)
{
    entity_t* ent;
    if(0>entity_init(&ent, 10, 24))
        return 1;
    printf("Entity: x%d y%d", ent->x, ent->y);
    return 0;
}

一个更常见的模式是:

entity_t *entity_new(int _x, int _y)
{
    entity_t *ent = malloc(sizeof(*ent));
    if (NULL==ent) 
        return NULL;
    ent->x = _x;
    ent->y = _y;
    return ent;
}

int main(void)
{
    entity_t* ent;
    if(NULL==(ent=entity_new(10,24)))
        return 1;
    printf("Entity: x%d y%d", ent->x, ent->y);
    return 0;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么这个 C 代码会产生无限循环?

为什么这个 C 程序会崩溃?

为什么这个'C'代码的输出是这样的?

为什么这个C ++函数会产生混乱的输出?

如果变量没有初始化,为什么这个 C 代码需要这么长时间来编译和执行?

为什么这个C ++函数会产生如此多的分支错误预测?

这个 C 程序可以工作,但编译会产生错误。为什么?

为什么这个结构赋值在 C 中不起作用?

为什么 C# 反射会抛出这个 BadImageFormatException

为什么 catch 不处理这个错误 C++

为什么这个C程序错误地输出2的幂?

为什么在这个方法中声明这个变量会覆盖我的类成员(C++)?

这个 C 指针错误是什么意思?为什么会这样

为什么这个非常简单的C#方法会产生这种不合逻辑的CIL代码?

如果无法在MSVC上编译,为什么使用C ++ 17`constexpr这个模板化结构?

为什么打印这个浮点数会导致 c 中的答案错误

为什么我在这个 C 代码中得到了错误的答案?

为什么这个简单的F#代码比C#/ C ++版本慢36倍?

为什么我的C ++代码看不到这个C#类成员?

为什么这个缩进是错误的?

为什么这个查询是错误的?

C 结构:为什么这个语句使用 . 符号来访问“赃物”而不是 ->?

为什么添加这个构造函数会导致我的 API 在 C# 中工作?

为什么我在 C 中使用 strcat 会遇到这个问题?

为什么 Codeblocks 运行这个 C 程序没有错误,但 Codeforces 显示编译错误?

为什么这个 C# 代码乱序执行?不是 ASYNC(至少我认为不是)

为什么这个 C 代码(写入 unix 管道)不无限迭代?

为什么这个C ++代码片段为右值分配值?

为什么我不能从这个 C 代码访问在汇编中声明的 Tss 变量?

TOP 榜单

热门标签

归档