为什么这一行使我的程序出现段错误?
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;
这显然会造成内存访问冲突,从而导致分段错误。
我删除了代码中无用的部分以使我的 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;
这显然会造成内存访问冲突,从而导致分段错误。