Структура с указателем и массивом структур в C - PullRequest
0 голосов
/ 04 ноября 2018

Я пытаюсь узнать о вложенных структурах и указателях в C. Я сделал это в качестве теста:

typedef struct xyz xyz_t;
struct xyz{
    int x, y, z;
};

xyz_t array[] = {
    {.x = 14, .y = 16, .z = 18}, 
    {.x = 34, .y = 36, .z = 38}, 
    {.x = 64, .y = 66, .z = 68},
};

typedef struct blue blue_t;
struct blue 
{
   int  *pointer;
};

int main() 
{
    blue_t red;
    red.pointer = &array;

    printf("%d",red.pointer[1].z);
}

Идея состоит в том, чтобы структура red имела указатель, указывающий на array, а затем print f.ex. array[1].z.

Что я делаю не так? Компилятор говорит мне:

присваивание из несовместимого типа указателя

[- Wincompatible-pointer-types] red.pointer = &array;

запрос на членство x в нечто, не являющееся структурой или объединением printf("%d",red.pointer[2].x);

Ответы [ 2 ]

0 голосов
/ 04 ноября 2018

Это должно быть исправлено. Посмотрите, поможет ли это:

typedef struct xyz{
    int x, y, z;
} xyz_t;

xyz_t array[] = {
    {.x = 14, .y = 16, .z = 18},
    {.x = 34, .y = 36, .z = 38},
    {.x = 64, .y = 66, .z = 68},
};

typedef struct {
    xyz_t *pointer;
} blue_t;

int main()
{
    blue_t red;
    red.pointer = &array;

    printf("%d",red.pointer[1].z);
}
0 голосов
/ 04 ноября 2018

Идея состоит в том, чтобы структура 'red' имела указатель, указывающий на 'array', и затем выведите f.ex. массив [1] .z.

В этом случае вам нужно иметь указатель на xyz_t в вашей "синей" структуре.

struct blue 
{
   xyz_t *pointer;
};

Вам нужно сбросить & с этого red.pointer = &array;. array будет преобразован в указатель на его первый элемент в red.pointer = array;, который является правильным типом (для соответствия LHS). См. Что такое распадающийся массив? ; тогда как &array имеет тип struct xyz (*)[3].

Кроме того, вы можете использовать правильную подпись для основной функции (int main(void)). red может сбить с толку переменную для blue_t типа!

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