2016-02-25 3 views
-1

Итак, я создал структуру с a с неинициализированным массивом внутри, но внешняя структура - это инициализированный массив. Затем я просматриваю и печатаю значения, но я ничего не получаю. NUM уже определен как 12.Инициализация массива struct с массивом внутри

#include "header.h" 
#include <stdio.h> 
#include <stdlib.h> 


void make() { 

struct suit { 
    char *type; 
    int people[]; 
} deck[4] = {"Hunter", NUM, 
    "Fighter", NUM, 
    "Jumper", NUM, 
    "Strider", NUM}; 





}; 
//print type and numbers 1-12 
for (int i = 0; i < 4; i++) { 

    for (int j = 0; j < NUM; i++) { 
     printf(deck[i].type); 
     printf(deck[i].people[j]); 

    } 
} 


} 
+0

Вы даже читать основы C? Ваши 'printf' ошибочны. Я не думаю, что ваш код даже компилируется успешно. –

+0

Какой у вас компилятор? – haccks

+0

Скомпилирует ли ваш код? – kaylum

ответ

-1

people является гибким элементом массива и Стандарт С не позволяет инициализации гибкого элемента массива. Хотя, GCC разрешает static initialization гибкого массива в качестве расширения. Так,

struct suit { 
    char *type; 
    int people[]; 
} deck = {"Hunter", NUM}; 

действительна сниппет в соответствии с НКУ, но в то же время GCC не позволяет вложенную инициализацию массива, когда гибкий элемент массива участвует и поэтому инициализатор deck[4] не является действительным.

Of course, this extension only makes sense if the extra data comes at the end of a top-level object, as otherwise we would be overwriting data at subsequent offsets. To avoid undue complication and confusion with initialization of deeply nested arrays, we simply disallow any non-empty initialization except when the structure is the top-level object. For example:

struct foo { int x; int y[]; }; 
struct bar { struct foo z; }; 

struct foo a = { 1, { 2, 3, 4 } };  // Valid. 
struct bar b = { { 1, { 2, 3, 4 } } }; // Invalid. 
struct bar c = { { 1, { } } };   // Valid. 
struct foo d[1] = { { 1, { 2, 3, 4 } } }; // Invalid. 

Также обратите внимание, что вы должны использовать соответствующие спецификатор формата в printf для различных типов данных.

+0

Downvoter, комментарий будет оценен? – haccks

+0

Я вижу, поэтому я должен был бы сделать это для каждого из них «Охотник, Истребитель» и т. Д. ... –

-1

Выделяет память int people[]; массива Итак, ваша структура должна выглядеть, так как это определение объекта:

struct suit { 
    char *type; 
    int people[10]; //compile time allocation 
} deck[4] = {"Hunter", NUM, 
    "Fighter", NUM, 
    "Jumper", NUM, 
    "Strider", NUM}; 
+1

Вы пытались скомпилировать этот код? – kaylum

+0

У вас есть правильная идея о том, что нужно указать размер «людей», однако вам также необходимо скопировать интуиционист для каждого элемента «колоды». В противном случае '' Истребитель'' принимается за инициализатор для 'deck [0] .people [1]' и т. Д. –

Смежные вопросы