2012-03-27 37 views
0

我有一個三維位表數組作爲如何使一個動態三維陣列,其中只有第一維是動態在c

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

你可以做這樣的事情:

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

我使用vc2010,我試圖將無效類型的malloc轉換爲無符號字符。請看我的編輯 – John 2012-03-27 13:35:55

+0

@John:你爲什麼要那樣做? 'bit_table'的類型爲'unsigned char(*)[100] [200]',而不是'unsigned char';另外,C中不需要指定'malloc()'的返回值;如果你使用C++,爲什麼不使用'vector'? – Christoph 2012-03-27 13:57:23

-2

對不起,但我沒有在這裏看到任何特殊的困難。除了Charlesworth提到的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 
+0

鏈接列表可能適用於大小的任意更改,但對數組式訪問不利。 – 2012-03-27 14:04:37

+0

@OliCharlesworth:是的,這就是爲什麼我把評論「如果你需要索引,然後使用realloc的方式」。 – 2012-03-27 14:20:47