我已经多年没有用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);
}
答案 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);
}