tft每日頭條

 > 生活

 > c語言二維數組與指針

c語言二維數組與指針

生活 更新时间:2024-12-23 22:39:27
二級指針創建二維數組

學習了數組,我們知道定義數組,可以申請到一段内存空間,可以在内存空間中存儲數據。例如:

char a[3][16] = {0};

此時定義了一個二維數組,該數組是一塊連續的内存空間。此時,a[0]元素是一維數組,有16個字節的内存空間。同理,a[1]、a[2]也是一維數組,都占用16個字節的存儲空間。程序測試例子如下:

c語言二維數組與指針(如何使用二級指針來創建二維數組)1

程序運行結果如下:

c語言二維數組與指針(如何使用二級指針來創建二維數組)2

在上面的例子中,使用數組的定義,數組的“維數”必須是固定的。例如,第一維是3,是有3個元素,即a[0]、a[1]、a[2]這樣的三個元素;而且,每一個一維元素占有16個字節的存儲空間。例如,a[0]占有16個字節的存儲空間。

那麼,如果我們開發一個網絡通信程序,有一個網絡數據包發送過來。那麼,網絡數據包的長度是不确定的,有可能是5個字節,也有可能是300個字節。

那麼,如果我們使用數組來定義一個内存塊,就盡量定義大容量的數組,才可以存放完整個網絡數據包。例如:

char buf[512];

此時,定義一個數組,該數組的容量是512個字節。但是,如果網絡數據包很大,是幾千個字節,那麼,就需要申請更大容量的内存塊。

那麼,在這種情況下,我們可以“動态申請”内存。修改上面的例子,程序測試例子如下:

c語言二維數組與指針(如何使用二級指針來創建二維數組)3

程序運行結果如下:

c語言二維數組與指針(如何使用二級指針來創建二維數組)4

可以看到,我們定義了一個數組,如下:

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個元素無法滿足,而且我們需要動态申請,那麼,可以修改代碼如下:

c語言二維數組與指針(如何使用二級指針來創建二維數組)5

程序運行結果如下:

c語言二維數組與指針(如何使用二級指針來創建二維數組)6

可以看到,我們定義一個二級指針 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每日頭條,我们将持续为您更新最新资讯!

查看全部

相关生活资讯推荐

热门生活资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved