引用指向另一个结构内部结构内部结构的指针
Reference of pointer to structure inside of structure inside of another structure
首先,这些是完整代码的链接:
注意:代码已修复。查看旧版本以查找不正确的代码。
我一直在尝试通过在参数中引用它来初始化一个 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编译和运行程序
您的内存分配问题一直存在:
(*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));
此外,在您的测试中,您永远不会释放分配的内存。
你不应该return指针作为整数:
int buildNormalVector(double x, double y, double z, Vector **v)
(*v) = (Vector *)malloc(sizeof(Vector *));
//
return v;
}
中 double x, y, z
的格式错误 "%d"
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);
}
首先,这些是完整代码的链接:
注意:代码已修复。查看旧版本以查找不正确的代码。
我一直在尝试通过在参数中引用它来初始化一个 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编译和运行程序
您的内存分配问题一直存在:
(*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));
此外,在您的测试中,您永远不会释放分配的内存。
你不应该return指针作为整数:
int buildNormalVector(double x, double y, double z, Vector **v)
(*v) = (Vector *)malloc(sizeof(Vector *));
//
return v;
}
中 double x, y, z
的格式错误 "%d"
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);
}