我已经很多年没有用 C 编程了,所以这可能是理所当然的。当我尝试读取 malloc 结构内的某些变量 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);
}
最佳答案
您按值将指针传递给 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);
}
关于c - 使用 malloc 时 C 中的奇怪段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25827734/