(原創) 如何動態建立二維陣列(多維陣列)? (C/C++) (C) - 博客园
文章推薦指數: 80 %
由*iax = (int*)(ia + sizex)對iax做初始化,之後每個loop的iax會隨著sizex而遞增,原理和第二個範例一樣。
而釋放陣列方面,只要如40行. free(ia);. 釋放 ...
首页
新闻
博问
专区
闪存
班级
我的博客
我的园子
账号设置
简洁模式...
退出登录
注册
登录
真OO无双之真乱舞书
寫程式是很快樂的一件事SinceSep.15,2006
(原創)如何動態建立二維陣列(多維陣列)?(C/C++)(C)
為什麼需要動態建立二維陣列呢?因為sizex和sizey可能run-time才得知,所以無法使用靜態的方式建立陣列,而二維陣列唯一的優點就是可用subscripting的方式,如ia[y][x]的方式存取陣列,但是這在C語言中並不容易,本文就是要介紹如何動態建立二維陣列。
Abstract為什麼需要動態建立二維陣列呢?因為sizex和sizey可能run-time才得知,所以無法使用靜態的方式建立陣列,而二維陣列唯一的優點就是可用subscripting的方式,如ia[y][x]的方式存取陣列,但是這在C語言中並不容易,本文就是要介紹如何動態建立二維陣列。
Introduction再重複一個觀念,C/C++沒有『真正』支援二維陣列,雖然ia[y][x]的語法看似二維陣列,但骨子裡仍是一維陣列,是利用arrayofarray的方式模擬二維陣列,事實上這就是C#的jaggedarray,所以當我們要動態建立二維陣列時,要先建立第一個一維陣列(sizey),然後在每個陣列的element上在建立第二個一維陣列(sizex),以這種方式模擬出二維陣列。
1 /* 2 (C) OOMusou 2007 http://oomusou.cnblogs.com 3 4 Filename : ArrayDynamicTwoDim_1.c 5 Compiler : Visual C++ 8.0 / ANSI C 6 Description : Demo how to dynamic allocate 2 dim array on heap by malloc() 7 Release : 05/18/2008 1.0 8 */ 9 #include
這裡為什麼會需要pointertopointer呢?在(原創)如何動態建立一維陣列?(C/C++)(C)時,若要用malloc()動態建立一個一維陣列,會用以下寫法:
int *ia = (int *)malloc((size_t)sizex * sizeof(int));
ia代表指向intia[sizex]第一個elementaddress的pointer,但現在我們是二維陣列,第一個陣列intia[sizey]的每個element存的不是int,而是第二個陣列intia[sizex],也就是說,第一個陣列每個element存的是int*,指向第二的陣列的第一個元素,而第一個陣列本身就是int*,兩個pointer加起來,才變成int**。
至於為什麼用sizeof(void*)呢?理論上該用sizeof(int*),但因為C/C++的pointer皆是4個byte,所以使用sizeof(void*)也可,而且可以泛用於所有型別的陣列。
28行的
ia[y] = (int *)malloc(()sizex * sizeof(int *));
是在第一個陣列的每個element,在存放第二個陣列,達成arrayofarray。
12行傳遞陣列到function時
void printTwoDimDynamicArray(int **ia, const int sizex, const int sizey)
用的是int**ia,很多人學靜態二維陣列時,就懷疑為什麼不用pointertopointer代表二維陣列呢?這裡總算用到了吧!!該怎麼釋放這個陣列呢?由於是arrayofarray,須先由內層的第二個陣列開始釋放,最後才能釋放外層的第一個陣列。
40行到42行的
for(y = 0; y != sizey; ++y) { free(ia[y]);}
釋放了第二層的陣列。
40行的
free(ia);釋放了第一層的陣列。
這是很標準的寫法,連微軟的KB也是建議用這種寫法INFO:動態記憶體配置於二維陣列,但這種寫法有幾個缺點,第二個陣列的malloc()在forloop中執行,導致memoryfragment,且釋放陣列也不方便。
若能不在forloop中使用malloc(),則釋放陣列的問題也能解決。
我們來看改進的方式。
1 /* 2 (C) OOMusou 2007 http://oomusou.cnblogs.com 3 4 Filename : ArrayDynamicTwoDim_2.c 5 Compiler : Visual C++ 8.0 / ANSI C 6 Description : Demo how to dynamic allocate 2 dim array on heap by malloc() 7 Release : 05/18/2008 1.0 8 */ 9 #include
在釋放記憶體方面,38行和39行的
free(ia[0]);free(ia);
因為只malloc()兩次,所以只要釋放兩次即可。
既然malloc()兩次要還要釋放兩次,有沒有辦法只mallc()一次呢?
1 /* 2 (C) OOMusou 2007 http://oomusou.cnblogs.com 3 4 Filename : ArrayDynamicTwoDim_3.c 5 Compiler : Visual C++ 8.0 / ANSI C 6 Description : Demo how to dynamic allocate 2 dim array on heap by malloc() 7 Release : 05/18/2008 1.0 8 */ 9 #include
int **ia = (int **)malloc(sizey * sizeof(void *) + sizey * sizex * sizeof(int *));
28行到29行的
for(y = 0; y != sizey; ++y, iax+=sizex) { ia[y] = iax;}
由*iax=(int*)(ia+sizex)對iax做初始化,之後每個loop的iax會隨著sizex而遞增,原理和第二個範例一樣。
而釋放陣列方面,只要如40行
free(ia);
釋放一次即可!!Conclusion一個很簡單的需求:動態二維陣列,在C語言竟然需要這麼大的功夫才能達成!!假如你還是無法理解,建議參考(原創)由一維陣列模擬二維陣列(多維陣列)(C/C++)(C),用一維陣列模擬二維陣列就好,唯一就是犧牲了ia[y][x]的語法,而改用*(ia+y*sizex+x)而已,在C++有容易的寫法,請參考(原創)如何動態建立二維陣列(多維陣列)?(C/C++)(C)‧SeeAlso(原創)由一維陣列模擬二維陣列(多維陣列)(C/C++)(C)(原創)如何動態建立一維陣列?(C/C++)(C)(原創)如何動態建立二維陣列(多維陣列)?(C/C++)(C)(原創)如何動態建立二維陣列(多維陣列)?(C/C++)(C)(C#)ReferenceINFO:動態記憶體配置於二維陣列《記憶體的配置》動態陣列
postedon
2007-02-2504:36
真OO无双
阅读(30263)
评论(6)
编辑
收藏
举报
刷新评论刷新页面返回顶部
Poweredby:
博客园
Copyright©2022真OO无双
Poweredby.NET6onKubernetes
导航
延伸文章資訊
- 1二維陣列malloc與free - 程式人生
特別適用於C語言動態字串陣列操作. #include <stdio.h> typedef unsigned int wchar; #define LENGTH 10 //需求:字串陣列的二維陣列...
- 2malloc、free、calloc 與realloc - OpenHome.cc
若要釋放記憶體,可以使用 free 函式,以下使用一個簡單的程式來示範動態配置的使用: ... 若要動態配置連續空間,並當成二維陣列來操作,就記得二維(或多維)陣列, ...
- 309_二維指標與陣列- 動態配置[m][n] 陣列@ 藍影
ptr = (資料型態*)malloc(sizeof(資料型態)*cnt);. 而今天我們要配置的是二維陣列,所使用到的指標是二次指標,也就是 int**, ...
- 4c語言: 什麼時候必用malloc而不直接宣告陣列? - iT 邦幫忙
譬如說要宣告一個5*4的 int 二維陣列, ... 依照對矩陣的切割也就有各種需求,那malloc使用完也都須要立即釋放(free)記憶體。 ... 這篇暫以指標動態配置一維陣列為例。
- 5(原創) 如何動態建立二維陣列(多維陣列)? (C/C++) (C) - 博客园
由*iax = (int*)(ia + sizex)對iax做初始化,之後每個loop的iax會隨著sizex而遞增,原理和第二個範例一樣。 而釋放陣列方面,只要如40行. free(ia);....