Массив указателей структуры, неверная ошибка инициализатора, в C - PullRequest
4 голосов
/ 14 марта 2012

Этот код:

extern void *malloc(unsigned int);
struct Box {
    int x, y ,w, h;
};

struct Wall {
    char color[15];
    struct Box *boxes[20];
};

int main(int argc, const char *argv[])
{
    struct Wall *mywall = malloc(sizeof(struct Wall));
    struct Box *myboxes[] = mywall->boxes;
    return 0;
}

выдает ошибку invalid initializer в строке 14. Я пытаюсь сделать копию массива указателей структуры, которые находятся в другой структуре.

Ответы [ 2 ]

5 голосов
/ 14 марта 2012

Уч;здесь есть ряд проблем.

extern void *malloc(unsigned int);

Не делайте этого;используйте #include <stdlib.h>, потому что это будет правильно, а то, что вы написали, обычно неверно (аргумент malloc() - это size_t, что необязательно unsigned int; это может быть unsigned long или какой-то другой тип).

struct Box {
    int x, y ,w, h;
};

Помимо случайного пробела, struct Box в порядке.

struct Wall {
    char color[15];
    struct Box *boxes[20];
};

И struct Wall в порядке.

int main(int argc, const char *argv[])

Вы не '• используя argc или argv, поэтому вам лучше использовать альтернативное объявление:

int main(void)

Исходный код еще раз:

{
    struct Wall *mywall = malloc(sizeof(struct Wall));

Это выделяет, но не инициализируетодин struct Wall.Само по себе это нормально, хотя вы должны проверить, что распределение прошло успешно, прежде чем использовать его.Вам также нужно беспокоиться о выделении struct Box элементов, на которые будут указывать элементы массива.

    struct Box *myboxes[] = mywall->boxes;

У вас здесь небольшая катастрофа.Вы не можете копировать такие массивы.Вы не проверили, что у вас есть массив.Игнорируя проверку ошибок, вы застряли с одним из:

    struct Box *myboxes[] = { &mywall->boxes[0], &mywall->boxes[1], ... };

или:

    struct Box **myboxes = &mywall->boxes;

Я не уверен, что вам понадобится вторая версия, хотя она короче.

    return 0;

Мне нравится видеть return 0; в конце main(), хотя C99 позволяет вам его опустить.

}
0 голосов
/ 14 марта 2012

Как насчет:

struct Box **myboxes = mywall->boxes;

Тогда вы можете делать такие вещи, как:

 for ( int i = 0 ; i < 15 ; i++ )
    mywall->boxes[i] = malloc(sizeof(Box));
 Box* x = myboxes[1];

Поскольку код сейчас, mywall->boxes не инициализирован.

ПРИМЕЧАНИЕ: просто перечитайте вопрос - это не вернет копию массива, а укажет на то же место. Нет короткого решения для копии без использования memcpy или просто копирования структур.

...