как сделать динамический трехмерный массив, где только первое измерение является динамическим в c - PullRequest
0 голосов
/ 27 марта 2012

У меня есть массив трехмерных битовых таблиц:

bit_table[dim1][100][200];

Второе и третье измерения всегда одинаковы.

Но dim1 должны расти со временем.

когда этот bit_table заполнен, его размер необходимо увеличить в измерении dim1 , а старое содержимое необходимо сохранить

Чтобы сохранить старое содержимое таблицы, я должен просто создать временный массив, скопировать в него данные старого массива и, после расширения массива, скопировать эти данные обратно?Или есть лучший способ сделать это?

РЕДАКТИРОВАТЬ:

int dim1=10;
unsigned char (*bit_table)[100][200] = (unsigned char)malloc(dim1 * sizeof(*bit_table));
printf("enter new dimension\n");
     scanf(dim1);

....

Ответы [ 2 ]

2 голосов
/ 27 марта 2012

Вы можете сделать что-то вроде этого:

int (*bit_table)[100][200] = malloc(dim1 * sizeof(*bit_table));

...

bit_table = realloc(bit_table, dim1_new * sizeof(*bit_table));

...

free(bit_table);

Очевидно, вам потребуется соответствующая обработка ошибок для обоих этих вызовов.В частности, если realloc не удастся (в приведенном выше коде), вы получите утечку памяти.

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

Извините, но я не увидел здесь особой сложности. Кроме realloc, как упоминал Чарльзуорт. Вы также можете:

typedef unsigned char bit_table_elem[100][200];

// if you're using c, linked list will be a good choice
// but if you really need indexing, then use the realloc way...
struct bit_table_list {
    bit_table_elem elem;
    struct bit_table_list* next;
}

// if you're using c++, std vector will be better
std::vector<bit_table_elem> bit_table
...