使用malloc时C中出现奇怪的分段错误

使用malloc时C中出现奇怪的分段错误,c,segmentation-fault,malloc,C,Segmentation Fault,Malloc,我已经很多年没有用C语言编程了,所以这可能是一个很简单的问题。当我试图读取malloc'd结构中的一些变量x、y、z时,在运行编译的二进制文件时会出现分段错误。如果我取消注释行://v=point3D_initialise(v),然后它就如预期的那样工作了。这就好像变量v没有保留分配地址一样。即使我在没有assert()的情况下调用函数,它也会出错: 将指针按值传递给测试集和ADPOINT3D(point3D*v),因此malloc返回值被分配给指针的副本。因此,传递给它的指针的实际值根本没有被

我已经很多年没有用C语言编程了,所以这可能是一个很简单的问题。当我试图读取malloc'd结构中的一些变量x、y、z时,在运行编译的二进制文件时会出现分段错误。如果我取消注释行://v=point3D_initialise(v),然后它就如预期的那样工作了。这就好像变量v没有保留分配地址一样。即使我在没有assert()的情况下调用函数,它也会出错:


将指针按值传递给
测试集和ADPOINT3D(point3D*v)
,因此malloc返回值被分配给指针的副本。因此,传递给它的指针的实际值根本没有被函数
TEST\u setandredpoint3d()
改变。因为它没有被修改,所以它仍然处于未初始化状态,所以当您尝试取消引用它时,会出现SEGFULTS

试试这个

void point3D_initialise(point3D** v) {
    *v = malloc(sizeof(point3D));
    (*v)->x = (*v)->y = (*v)->z = 0;
}

void TEST_start() {
    point3D *v;
    point3D_initialise(&v);
    /* v now has memory allocated to it */
    free(v);
}

初始化函数很奇怪;您传入一个指针值,通过使用
malloc()
覆盖它来忽略它,设置成员,然后返回新分配的指针。当您在没有使用initialize函数初始化的情况下尝试使用v`in
TEST\u start()
时,您正在使用
printf()
调用中的引用调用未定义的行为。纯属偶然(可能不是,因为经常被问到),几乎是这一小时的重复我是个白痴!是的,这就是原因。我认为指针会因为一些奇怪的原因被自动引用。我已经这样做了,但我也让point3D_initialise()返回一个带有:return*v;的值;。这是因为我喜欢使用该函数作为另一个函数的参数,以较少的代码测试返回值。谢谢。
void point3D_initialise(point3D** v) {
    *v = malloc(sizeof(point3D));
    (*v)->x = (*v)->y = (*v)->z = 0;
}

void TEST_start() {
    point3D *v;
    point3D_initialise(&v);
    /* v now has memory allocated to it */
    free(v);
}