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

时间:2014-09-13 21:09:53

标签: c segmentation-fault malloc

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

typedef struct {
    int x, y, z;
} point3D;

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

int TEST_setAndReadPoint3D(point3D *v) {
    v = point3D_initialise(v);
    assert(v!=NULL);
    if((v->x == 0) && (v->y == 0) && (v->z == 0))
        return 1;
    else return 0;
}

void TEST_start() {
    point3D *v;
    assert(TEST_setAndReadPoint3D(v));
    //v = point3D_initialise(v);
    printf("x=%d y=%d z=%d\n", v->x, v->y, v->z);
    free(v);
}

1 个答案:

答案 0 :(得分:4)

您将指针按值传递给TEST_setAndReadPoint3D(point3D *v),因此malloc返回值将分配给指针的副本。因此,函数TEST_setAndReadPoint3D()根本没有改变传递给它的指针的实际值。因为它没有被改变,所以它仍然没有被初始化,因此当你试图取消引用它时你会得到段错误。

试试这个

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);
}