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

标签 c segmentation-fault malloc

我已经很多年没有用 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/

相关文章:

c - 如何修复 linux 内核部分不匹配?

c - 需要二维数组的解释(+传递给函数)

c - 没有参数的 `printf("%p")` 是什么意思

c++ - 字符串流的段错误

Linux内核: sequence of events/paths before process coredump happens

c - 在 C 中对 char 输入使用 malloc

c++ - 使用可变参数的宏

c - C语言中malloc的使用

c - 函数内动态重新分配 - C

c++ - 总线错误 10 - char * array