Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 指向另一个结构内部结构内部结构的指针引用_C_Pointers_Struct_Reference_Dynamic Memory Allocation - Fatal编程技术网

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

C 指向另一个结构内部结构内部结构的指针引用,c,pointers,struct,reference,dynamic-memory-allocation,C,Pointers,Struct,Reference,Dynamic Memory Allocation,在任何内容之前,这些都是完整代码的链接: 注意:代码已修复。请参阅旧版本以查找不正确的代码 我一直试图通过在参数中引用向量来初始化向量(如线性代数中的向量),如下所示: int buildNormalVector(double x, double y, double z, Vector **v) { (*v) = (Vector *)malloc(sizeof(Vector *)); (*v)->x = x; (*v)->y = y; (*v

在任何内容之前,这些都是完整代码的链接:

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

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

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;
}
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;
};
其中
向量的结构如下所示:

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;
}
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));
(*v) = (SimpleVector *)malloc(sizeof(SimpleVector *));
下面是我如何初始化每个作为基础的
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)
,但对我来说,这太令人困惑了,而且不起作用。上面的示例可以正常工作,但只有一半的时间可以正常工作,并且在这一行出现读取访问冲突错误:

buildSimpleVector(1, 0, 0, &((*v)->base->i));
(*v) = (SimpleVector *)malloc(sizeof(SimpleVector *));
有时程序会通过所有测试,有时不会(这是这个问题中最奇怪的部分)

我确信,要更改main中声明的
向量*v
必须通过引用传递,如
向量**v
,然后我可以执行
(*v)=malloc并将其更改..
以更改原始向量,并且由于运算符的优先级,需要使用括号。当我传递
SimpleVector
的引用来构建它时,或者当我分配
向量时,问题就出现了?我可以这样做吗

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));
此外,在测试中,您从未释放分配的内存

您不应在以下位置以整数形式返回指针:

int buildNormalVector(double x, double y, double z, Vector **v)
(*v) = (Vector *)malloc(sizeof(Vector *));
//
 return v;
}
中的
双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(SimpleVector*)
。我看不出您实际上在哪里为
sizeof(SimpleVector)
本身分配空间?也许您在所有
malloc
s之后错过了第二个
malloc
?是的,dumb me不知道
sizeof(SimpleVector*)
sizeof(SimpleVector)
有很大不同。谢谢谢谢我应该知道
sizeof(Vector*)
不同于
sizeof(Vector)
。释放所有这些向量也被删除了,因为在某个点上,我在未初始化的指针上点击了一个
free
,这可能就是为什么我运行这个代码,有时工作,有时不工作的原因。另外,感谢您在我赶着这段代码明天提交时注意到了其他错误。@LeoVen不客气!如果发生错误,我总体上喜欢你的代码。继续做好工作。使用编译器选项
/Wall
/w4
编译代码,以捕获许多问题。()