【问题标题】:Reference of pointer to structure inside of structure inside of another structure指向另一个结构内部结构内部结构的指针的引用
【发布时间】:2018-09-11 04:29:12
【问题描述】:

首先是完整代码的链接:

注意:代码已修复。查看旧版本以查找不正确的代码。

我一直在尝试通过在这样的参数中引用它来初始化一个向量(就像在线性代数中一样):

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)aswell,但对我来说太混乱了,它不起作用。上面的例子有效,但只有一半的时间,并在这一行给出了读取访问冲突错误:

(*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 编译和运行程序

【问题讨论】:

  • 你在分配指针的大小,例如sizeof(SimpleVector *)。我看不到您实际上在哪里为sizeof(SimpleVector) 本身分配了空间?也许您在所有mallocs 之后错过了第二个malloc
  • 是的,愚蠢的我不知道sizeof(SimpleVector *)sizeof(SimpleVector) 完全不同。谢谢!

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


【解决方案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);
}

【讨论】:

  • 谢谢!我应该知道sizeof(Vector *)sizeof(Vector) 不同。释放所有这些向量也被删除了,因为在某些时候我在一个未初始化的指针上点击了free,这可能就是我运行这段代码并且有时工作,有时不工作的原因。还要感谢您在我明天急于提交此代码时注意到其他错误。
  • @LeoVen 欢迎您!错误发生了,我喜欢你的代码。保持良好的工作。使用带有编译器选项 /Wall/w4 的代码进行编译以捕获许多问题。 (msdn.microsoft.com/en-us/library/fwkeyyhe.aspx)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-09
  • 1970-01-01
  • 2021-12-28
  • 1970-01-01
  • 2016-09-10
  • 1970-01-01
  • 2017-07-13
相关资源
最近更新 更多