代码之家  ›  专栏  ›  技术社区  ›  user8298902

指向另一个结构内部的结构内部的结构的指针引用

  •  1
  • user8298902  · 技术社区  · 6 年前

    在任何内容之前,以下是完整代码的链接:

    笔记 :代码已修复。请参阅旧版本以查找错误代码。

    我一直试图通过在如下参数中引用向量来初始化向量(如线性代数):

    int buildNormalVector(double x, double y, double z, Vector **v)
    {
        (*v) = (Vector *)malloc(sizeof(Vector *));
        (*v)->x = x;
        (*v)->y = y;
        (*v)->z = z;
        (*v)->base = (Basis *)malloc(sizeof(Basis *));
        buildSimpleVector(1, 0, 0, &((*v)->base->i));
        buildSimpleVector(0, 1, 0, &((*v)->base->j));
        buildSimpleVector(0, 0, 1, &((*v)->base->k));
        return v;
    }
    

    其中 Vector 是这样的:

    typedef struct Vector Vector;
    typedef struct SimpleVector SimpleVector;
    typedef struct Basis Basis;
    
    struct Vector {
        double x;
        double y;
        double z;
        Basis *base;
    };
    
    struct Basis {
        SimpleVector *i;
        SimpleVector *j;
        SimpleVector *k;
    };
    
    struct SimpleVector {
        double x;
        double y;
        double z;
    };
    

    请注意此行:

    buildSimpleVector(1, 0, 0, &((*v)->base->i));
    

    下面是我如何初始化每个 SimpleVector 这将作为一个基础:

    int buildSimpleVector(double x, double y, double z, SimpleVector **v)
    {
        (*v) = (SimpleVector *)malloc(sizeof(SimpleVector *));
        (*v)->x = x;
        (*v)->y = y;
        (*v)->z = z;
        return 0;
    }
    

    我一直在努力找到正确的方法来传递对 i, j, k 该向量的向量基。我试过了 &(*((*v)->base)->k) 也一样,但对我来说,这太令人困惑了,而且不起作用。上面的示例可以正常工作,但只有一半的时间可以正常工作,并且在这一行出现读取访问冲突错误:

    (*v) = (SimpleVector *)malloc(sizeof(SimpleVector *));
    

    有时程序会通过所有测试,有时不会(这是这个问题中最奇怪的部分)。

    我确信要改变 Vector *v 必须通过如下引用传递在main中声明的 Vector **v 然后我就可以 (*v) = malloc and change it.. 更改原始值,并且由于运算符的优先级,需要使用括号。当我传递 SimpleVector 或者当我分配 矢量 ?我可以这样做吗?

    Vector *v;
    buildNormalVector( 1, 2, 3, &v);
    

    关于结构、指针和内存分配的问题可能太多了,所以如果您知道任何可以解释所有这些概念的好书或网页,我将不胜感激!

    编辑 :

    我一直在使用Visual Studio 2017编译和运行该程序

    1 回复  |  直到 6 年前
        1
  •  1
  •   sg7 Krafty Coder    6 年前

    内存分配存在一致性问题:

    (*v) = (Vector *)malloc(sizeof(Vector *));
    
    (*v)->base = (Basis *)malloc(sizeof(Basis *));
    
    (*v) = (SimpleVector *)malloc(sizeof(SimpleVector *));
    

    分配的内存太小,无法容纳您的结构。将其更改为:

    (*v) = malloc(sizeof(Vector));
    
    (*v)->base = malloc(sizeof(Basis));
    
    (*v) = malloc(sizeof(SimpleVector));
    

    此外,在测试中,您从未释放分配的内存。

    您不应在中以整数形式返回指针:

    int buildNormalVector(double x, double y, double z, Vector **v)
    (*v) = (Vector *)malloc(sizeof(Vector *));
    //
     return v;
    }
    

    格式错误 "%d" 对于 double x, y, z 在里面

    void displayVector(Vector *v)
    {
        printf("\nVector\n[%8.2lf i ]\n[%8.2lf j ]\n[%8.2lf k ]", v->x, v->y, v->z);
        printf("\nBase\n[%d, %d, %d], [%d, %d, %d], [%d, %d, %d]\n",
            v->base->i->x, v->base->i->y, v->base->i->z,
            v->base->j->x, v->base->j->y, v->base->j->z,
            v->base->k->x, v->base->k->y, v->base->k->z);
    }