Dynami c массивы вложенных структур - PullRequest
2 голосов
/ 08 мая 2020

Я пытаюсь использовать набор вложенных структур; один, который определяет одну координату в 3D (coordinate), и другой, который описывает определенные свойства прямоугольника (rectangle). Количество прямоугольников динамически изменяется во время выполнения, и mallo c успешно работает над назначением массива прямоугольной структуры. Моя проблема заключается в использовании массивов вложенных структур (Face_Close и Face_Far) фиксированного размера из 4 элементов, которые я не могу выделить / использовать успешно.

Вложенные структуры:

//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;

Я выделяю внешнюю структуру динамической части памяти размером c с помощью указателя:

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_Close или Face_Far; мой код успешно компилируется без предупреждений, но генерирует ошибку SIGSEGV (Mem Error) во время выполнения при попытке:

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

или

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

Я уже пробовал следующее:

  • Изменение coordinate Face_Far[4]; на coordinate *(Face_Far[4]);, однако это также дает SIGSEGV (Mem Error).
  • Изменение coordinate Face_Far[4]; на int *Face_Far[4]; и использование его в качестве массива указателей, который также выделяется с использованием mallo c с использованием cellArray[currentCell]->Face_Close = (coll_rect_coord**) malloc(4 * sizeof(coll_rect_coord *)), однако это также дает SIGSEGV (Mem Error).
  • Изменение coordinate Face_Far[4]; на int *Face_Far[4]; и попытка присвоения значения, на которое ссылается указатель, cellArray[currentCell]->Face_Close = &(coll_rect_coord**) malloc(4 * sizeof(coll_rect_coord *)), которое завершается с помощью ошибка lvalue требуется как унарный '& операнд

1 Ответ

1 голос
/ 08 мая 2020

Вы выделяете массив указателей на 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;
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...