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

时间:2018-04-01 22:10:31

标签: c pointers struct reference dynamic-memory-allocation

在此之前,这些是完整代码的链接:

注意:代码已修复。查看旧版本以查找错误的代码。

我一直试图通过在这样的参数中引用它来初始化Vector(如线性代数):

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

有时程序会经历所有测试,有时它不会(这是本期最奇怪的部分)。

我确信要更改在main处声明的Vector *v必须通过Vector **v之类的引用传递,然后我可以(*v) = malloc and change it..更改原始版本,并且由于运算符优先级,需要括号。当我传递SimpleVector的引用来构建它或者我分配Vector时,问题是什么?我可以这样做吗?

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

关于结构,指针和内存分配可能有太多问题,所以如果你知道任何可以解读所有这些概念的好书或网页,我会非常感激!

修改

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

1 个答案:

答案 0 :(得分:1)

内存分配存在一致问题:

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