为什么这一行使我的程序出现段错误?

Why this line make my program segfault?

我删除了代码中无用的部分以使我的 post 更清晰。

问题出在这里,函数init_dda()中的第一行也是唯一一行使我的程序出现段错误,我真的不明白怎么可能,如果你有解释,谢谢你。

void    dda_algorithm(t_env *e)
{
    t_dda   *d;

    d = NULL;
    init_dda(e, d);
}

void    init_dda(t_env *e, t_dda *d)
{
    d->map_x = 3;
}

这是我的结构的构造t_dda:

typedef struct  s_dda
{
    int         map_x;
}               t_dda;

我没有启用警告标志的编译错误。

在您的 init_dda() 调用中,您将第二个参数 d 作为 NULL 传递。

然后,在 init_dda() 中,您正在尝试取消引用该指针。这(取消引用 NULL 指针,这也是一个无效指针)调用 undefined behaviour。分段错误是副作用之一。

解决方案: 在将内存传递给 init_dda() 之前,您需要先将内存分配给 d。您可以查看 malloc() 和函数族。

您使用第二个参数 d 调用了 init_dda,您刚刚将其分配给 NULL。因此,您的代码试图取消对 NULL 的引用,这是一种很好的分段错误方法。

存在空指针:

d = NULL;

传递给函数:

init_dda(e, d);

你正在访问这个结构的成员,它是空的:

d->map_x = 3;

d 为空
这会导致段错误

您正在为未初始化的对象赋值。

您的 d 指针为空,但您正试图向其中写入内容。

init_dda(e, d)d=NULL 调用,然后尝试取消引用它访问:

 d->map_x = 3;

这显然会造成内存访问冲突,从而导致分段错误。