【发布时间】: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