2015-02-28 2 views
1

Я хочу создать структуру с 2 массивами, и я хочу, чтобы пользователь указывал количество переменных, которые они хранят. Но я получаю ошибки, когда я запускаю это:C Два массива в Struct

typedef struct Image 
{ 
    int amount; 
    char* paths[amount]; 
    SDL_Texture* textures[amount]; 

} Image; 

Почему я получаю ошибки и как их решить?

+1

Вы не можете иметь размера массивов переменных, как это. –

+0

Вам, по-видимому, нужны указатели-указатели и управление динамической памятью. – WhozCraig

+0

@JonathonReinhart Почему я не могу этого сделать? Вы делаете это для петель? –

ответ

3

Чтобы иметь динамические массивы, вам нужно указатели:

typedef struct Image 
{ 
    int amount; 
    char** paths; // pointer to pointer of chars 
    SDL_Texture** textures; // pointer to pointer of textures 
} Image; 

При создании объекта структуры, зная реальный размер («Сумма»), вы затем выделять память динамически:

struct Image img; 
img.paths = calloc (amount, sizeof(char*)); 
img.textures = calloc (amount, sizeof(SDL_Texture*)); 
img.amount = amount; 

Из Конечно, вам нужно проверить, что выделенные poitners не являются NULL.

Затем вы можете получить доступ к элементам, как вы бы сделали с вашей собственной структурой.

Примечание: массив переменной длины является дополнительной функцией стандарта C11. Не каждый компилятор поддерживает его. Но в любом случае, typedef никогда не допускает массив переменной длины, потому что компилятор C должен знать во время компиляции размер всего struct. Это возможно только в том случае, если размер массива является константой.

+1

Любые причины для 'calloc'? – Deduplicator

+0

Потому что это упрощает распределение массива и инициирует весь материал до 0. – Christophe

+2

Ну, первый из них является веской причиной для него, а второй - причиной для него. Также 'sizeof * img.path' вместо' sizeof (char *) 'является более безопасной идеей. – Deduplicator

2

Динамический массив не разрешен в C. Размер должен быть известен во время компиляции.

Что вы должны сделать здесь

typedef struct Image 
{ 
    int amount; 
    char** paths; 
    SDL_Texture** textures; 

} Image; 

Image* img = (Image*)malloc(sizeof(Image)); 
img->amount = 42; 
img->paths = (char**)malloc(sizeof(char*) * img->amount); 
img->textures = (SDL_Texture**)malloc(sizeof(SDL_Texture*) * img->amount); 
Смежные вопросы