學習了數組,我們知道定義數組,可以申請到一段内存空間,可以在内存空間中存儲數據。例如:
char a[3][16] = {0};
此時定義了一個二維數組,該數組是一塊連續的内存空間。此時,a[0]元素是一維數組,有16個字節的内存空間。同理,a[1]、a[2]也是一維數組,都占用16個字節的存儲空間。程序測試例子如下:
程序運行結果如下:
在上面的例子中,使用數組的定義,數組的“維數”必須是固定的。例如,第一維是3,是有3個元素,即a[0]、a[1]、a[2]這樣的三個元素;而且,每一個一維元素占有16個字節的存儲空間。例如,a[0]占有16個字節的存儲空間。
那麼,如果我們開發一個網絡通信程序,有一個網絡數據包發送過來。那麼,網絡數據包的長度是不确定的,有可能是5個字節,也有可能是300個字節。
那麼,如果我們使用數組來定義一個内存塊,就盡量定義大容量的數組,才可以存放完整個網絡數據包。例如:
char buf[512];
此時,定義一個數組,該數組的容量是512個字節。但是,如果網絡數據包很大,是幾千個字節,那麼,就需要申請更大容量的内存塊。
那麼,在這種情況下,我們可以“動态申請”内存。修改上面的例子,程序測試例子如下:
程序運行結果如下:
可以看到,我們定義了一個數組,如下:
char* a[3] = {0};
該數組的元素是char*類型的指針類型,它可以指向一塊内存的首地址。然後,我們再為數組的每一個元素申請内存塊,如下:
a[0] = (char*)calloc(1, size);
a[1] = (char*)calloc(1, size);
a[2] = (char*)calloc(1, size);
此時,a[0]、a[1]、a[2]元素就存放一個内存塊的首地址,而且,該内存塊的容量是size個字節。
所以,在程序中,我們可以動态修改size變量的大小,就可以申請不同容量的内存塊。滿足程序設計中動态、彈性使用内存塊的需求。
在上面的例子中,我們定義了數組a[3]的容量是3個元素,那麼,如果我們的程序又需要大量的内存,3個元素無法滿足,而且我們需要動态申請,那麼,可以修改代碼如下:
程序運行結果如下:
可以看到,我們定義一個二級指針 char** a,然後,給它申請内存,如下:
a = (char**)calloc(num, sizeof(char*));
此時,指針 a 指向一個内存塊的首地址,該内存塊有num個元素,每個元素占用char*類型變量的大小。所以,每個元素可以存放一個char*類型的指針變量值。所以,我們可以動态修改num變量,動态申請内存塊的容量。
例如,設置num = 300,此時,可以使用a[299]這樣的元素,再可以執行:
a[299] = calloc(1, size);
那麼,a[299]這個元素又可以指向一塊内存塊,該内存塊占用size個字節的内存。
所以,這裡我們介紹了使用二級指針,可以創建一個二維數組的内存塊。而且,可以動态修改申請内存塊的容量。
注意,使用malloc、calloc等動态申請内存塊的函數,申請了内存之後,不再使用該内存時,需要手動調用free函數來釋放内存塊。
動态申請的内存塊,如果不調用free()函數來釋放,造成内存洩漏,内存無法回收,程序沒有足夠的内存空間可以繼續運行。程序異常。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!