2013-10-01 3 views
0

Я планирую создать 2D массив указателя, полученного из typedef structДекларирование и инициализация 2D массив неизвестного размера в C

Скажем typedef struct назван «Items» и содержит смешанные переменные строки и целые числа.

Я объявлю две переменные int, а именно: typenum и typetotal. Эти два целых числа начинаются с нуля и складываются, когда входные данные соответствуют определенной функции.

В массиве, Items *type[][], в основном type[][] является Items *type[typenum][typetotal], но я не могу этого сделать, так как я объявлю typenum и typetotal как ноль в декларации части.

Я попытался инициализировать массив через Items *type[][] = {{0},{0}}, но это порождает ошибку.

Любые советы? Некоторые сказали мне использовать malloc(), но я просто не знаю, как это сделать.

* Использование Крошечные C на Windows,

ответ

2

Использование динамического выделения памяти.

Items **type; 
type = malloc(sizeof (Items *) * typenum); 

for (int i = 0; i < typenum; i++) 
    type[i] = malloc(sizeof Items) * typetotal); 

После использования массива вам необходимо вручную освободить выделенную память.

for (int i = 0; i < typenum; i++) 
    free(types[i]); 

free(types); 

Вот учебник по нему: http://www.eskimo.com/~scs/cclass/int/sx9b.html

+0

[Пожалуйста, не бросайте возвращаемое значение 'malloc()' in C] (http://stackoverflow.com/a/605858/28169). – unwind

+0

@ Rafi Kamal Будет ли этот код работать, если я хочу инициализировать единый массив скобок? –

+0

@unwind Спасибо за ссылку, я отредактировал свой ответ –

0

Если typenum и typetotal увеличение в вашей программе работает обязательно использовать realloc, который будет перераспределять больше памяти и сохранить содержимое. Вам нужно выделить первое измерение массива, как это:

myArray = realloc(myArray, sizeof(Items*) * typenum); 

, а затем выделить второе измерение для каждого из первого:

for(...) 
    myArray[i] = realloc(myArray[i], sizeof(Items) * typetotal); 
+0

Я буду использовать 'realloc' каждый раз, когда' typenum' и 'typetotal' увеличиваются? –

+0

Правильно. Остерегайтесь нехватки памяти, в которой она вернет NULL, но оставить выделенную * нераспределенную * память * памяти вероятной утечкой памяти! – noelicus

+0

Просто, чтобы мне было ясно, я положу 'type [i] = malloc (sizeof Items) * typetotal)' сначала, а затем под ним, я поставлю ваш предложенный код 'type [i] = realloc (type [ i], sizeof (Items) * typetotal); 'Затем после этого я добавлю' free (type [i]); 'тогда я закончу скобку для' for (...) 'и поставлю' free (типов); '? –

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