Доступ к значению из указателя на указатель - PullRequest
0 голосов
/ 01 мая 2019

Я пытаюсь получить доступ к полю из структуры через указатель указателя

Я пытался:

(**vform).vpolygon->point->x = 1;                                               

Но не сработало.

код:

typedef struct point{
    int x;
}point;
typedef struct polygon{
    point *point;
}polygon;
typedef struct form{
    polygon **polygon;
}form;
void main(){
      polygon *vpolygon;
      form **vform;
      vpolygon = (polygon *)malloc(sizeof(polygon)*5);
      vform = (form **)malloc(sizeof(form)*5);
      vpolygon->point->x = 1;
      vform->vpolygon->point->x = 1;
}

Я ожидаю, что программа скомпилируется, но фактический результат равен

18:12: error: '*vform' is a pointer; did you mean to use '->'?
       vform->vpolygon->point->x = 1;
            ^~
            ->

1 Ответ

1 голос
/ 01 мая 2019

Код ниже должен компилироваться так, как вы хотите. Однако есть много проблем с тем, что вы делаете, которые могут быть не очевидны сразу, но я расскажу об этом чуть ниже.

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, вы потеряете этот исходный адрес и вызовете утечки памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...