Код ниже должен компилироваться так, как вы хотите. Однако есть много проблем с тем, что вы делаете, которые могут быть не очевидны сразу, но я расскажу об этом чуть ниже.
typedef struct point {
int x;
} point;
typedef struct polygon {
// dynamically allocated array of point
point *point;
} polygon;
typedef struct form {
// dynamically allocated array of polygon
polygon *polygon;
} form;
form *vform;
vform = malloc(sizeof(form) * 5);
vform->polygon = malloc(sizeof(polygon) * 5);
vform->polygon->point = malloc(sizeof(point) * 5);
vform->polygon->point->x = 1;
Первая проблема заключается в том, что вы смешиваете свои переменные с членами ваших структур . Ваша структура form
не имеет элемента с именем "vpolygon". То, что ваша переменная «vpolygon» является структурой polygon
, не означает, что вы можете внезапно обратиться к polygon
члену переменной form
, назвав ее «vpolygon».
Во-вторых, вы приводите возвращаемое значение malloc
. Не делай этого. Смотри я разыгрываю результат malloc
В-третьих, ваша форма malloc
выделяет достаточно памяти для 5 структур форм, но приводит результат к указателю на указатель на форму. Возможно, значение malloc должно быть malloc(sizeof(form *) * 5)
, но я предполагаю, что вы действительно имели в виду (vform *)malloc...
, а не (vform **)malloc...
.
В-четвертых, вы динамически распределяете массивы и указываете свои переменные на первый элемент в массиве, но у вас, похоже, нет никакого механизма для определения размера массива. Вам нужен метод для отслеживания размера массива, чтобы вы случайно не вызвали ошибку сегментации, выходя из конца массива. (Три распространенных метода: 1) отслеживать количество выделенных элементов. 2) Пометьте конец массива некоторым значением маркера и проверьте, если, 3) жестко закодируйте его. У всех есть компромиссы)
Пятый. Вы хотите сохранить исходное значение, возвращаемое malloc
, чтобы вы могли free
его в какой-то момент - если вы измените то, на что указывает vfrom
, вы потеряете этот исходный адрес и вызовете утечки памяти.