动态嵌套结构数组

问题描述 投票:2回答:1

我正在尝试使用一组嵌套结构;一种定义3D单一坐标(coordinate),另一种描述矩形的特定属性(rectangle)。矩形的数量在运行时动态变化,并且malloc成功地分配了矩形结构数组。我的问题在于使用固定大小为4项的嵌套结构数组(Face_CloseFace_Far),我似乎无法成功分配/使用它。

嵌套结构:

//co-ordinate structure
typedef struct coordinate
{
    double X;
    double Y;
    double Z;
} coordinate;

//rectangle
typedef struct rectangle
{
    coordinate Face_Close[4];
    coordinate Face_Far[4];
    coordinate Rotation_Centre;
    coordinate Normal_To_Plane;
} rectangle;

我正在使用指针将外部结构分配给内存的动态大小部分:

struct rectangle **cellArray;

cellArray的内存已在运行时使用以下命令成功分配和定义:

cellArray = (rectangle**) malloc(num_Cells * sizeof(rectangle*));

虽然我可以使用以下方法分配单个嵌套结构实例的元素:

cellArray[currentCell]->Rotation_Centre.X = X_value;
cellArray[currentCell]->Rotation_Centre.Y = Y_value;
cellArray[currentCell]->Rotation_Centre.Z = Z_value;

我似乎无法将内部结构数组用于Face_CloseFace_Far;我的代码在没有警告的情况下成功编译,但是在运行时尝试执行以下任一操作时生成SIGSEGV(错误)错误:

cellArray[currentCell]->Face_Close[1]->X

cellArray[currentCell]->Face_Close[1].X

我已经尝试过以下方法:

  • 但是将coordinate Face_Far[4];更改为coordinate *(Face_Far[4]);也会产生SIGSEGV(错误)。
  • coordinate Face_Far[4];更改为int *Face_Far[4];并将其用作指针数组,该指针数组也使用cellArray[currentCell]->Face_Close = (coll_rect_coord**) malloc(4 * sizeof(coll_rect_coord *))通过malloc进行分配,但是这也会产生SIGSEGV(内存错误)。
  • coordinate Face_Far[4];更改为int *Face_Far[4];,并尝试通过cellArray[currentCell]->Face_Close = &(coll_rect_coord**) malloc(4 * sizeof(coll_rect_coord *))分配指针引用的值,结果返回的错误值是一元'&操作数
c arrays malloc structure dynamic-memory-allocation
1个回答
1
投票

您分配了一个指向rectangle结构的指针数组,但没有使这些指针指向实际的结构,没有分配。实际上,这些指针是未初始化的,因此取消引用它们具有未定义的行为:在您的情况下是分段错误。

您应该分配结构,或使cellArray指向rectangle数组的指针并适当地分配它:

struct rectangle *cellArray;

cellArray = malloc(num_Cells * sizeof(*cellArray));

如果输入currentCell < num_Cells,请写:

cellArray[currentCell].Rotation_Centre.X = X_value;
cellArray[currentCell].Rotation_Centre.Y = Y_value;
cellArray[currentCell].Rotation_Centre.Z = Z_value;

cellArray[currentCell].Face_Close[1].X = X_value;
...
© www.soinside.com 2019 - 2024. All rights reserved.