目錄
網站建設哪家好,找創新互聯!專注于網頁設計、網站建設、微信開發、成都小程序開發、集團企業網站建設等服務項目。為回饋新老客戶創新互聯還提供了突泉免費建站歡迎大家使用!🍊前言🍊:
🥝正文:柔性數組🥝:
? 1.柔性數組的特點:
? 2.柔性數組的使用:
? 3.柔性數組的優勢:
🍒總結🍒:
🍊前言🍊:🛰?博客主頁:??鑾同學的干貨分享基地
🛰?歡迎關注:👍點贊🙌收藏??留言
🛰?系列專欄:💐【進階】C語言學習
🛰?代碼倉庫:🎉VS2022_C語言倉庫
? 家人們更新不易,你們的👍點贊👍和👉關注👈真的對我真重要,各位路過的友友麻煩多多點贊關注,歡迎你們的私信提問,感謝你們的轉發!
?關注我,關注我,關注我,你們將會看到更多的優質內容!!
🏡🏡本文重點🏡🏡:
🚅柔性數組特點🚃柔性數組使用🚃柔性數組優勢🚏🚏
? 在上一篇文章中,我們通過幾個函數的使用,實現了對動態內存空間的創建、修改和釋放,使我們的內存空間成功的“ 動態 ”了起來,而今天我們將通過柔性數組的介紹和使用,真正讓我們的動態內存空間得以應用。
🥝正文:柔性數組🥝:? 或許很多人,甚至包括一些已經參加工作了的老程序員,都未曾聽過柔性數組(flexible array)這個概念,但是它又是確實存在的,并且它的存在對于我們進行動態內存管理有著巨大的作用。在 C99 標準中,結構中的最后一個元素的大小允許是位置大小的數組,而我們就將這個未知大小的數組稱為柔性數組,并將這個數組成員稱為柔性數組成員:
typedef struct A
{
int a;
int arr1[0];
//柔性數組成員
}A;
typedef struct B
{
int b;
int arr2[];
//柔性數組成員
}B;
? 1.柔性數組的特點:? 根據上面我們說到的柔性數組定義,我們可以得知,柔性數組主要有以下 3 個特點:
①. 結構中的柔性數組成員前面必須至少存在一個其他成員。
②. sizeof 返回的這種結構大小不包括柔性數組的內存。
③. 包含柔性數組成員的結構用 malloc () 函數進行內存的動態分配,并且分配的內存應該大于結構的大小,以適應柔性數組的預期大小。
? 定義中我們可以得知,柔性數組只能作為結構的最后一個元素,并且柔性數組的大小是不確定的,因此在結構中,柔性數組之前至少要有一個其它成員的存在。
? 因為柔性數組的大小是未知的,因此在計算結構大小時,將不會計入柔性數組的大小:
typedef struct test
{
int i;
int arr[];
}test;
int main()
{
test a;
printf("The size of a is :%d\n", sizeof(a));
return 0;
}
? 例如上述代碼的編譯運行結果顯示,類型 a 的大小為 4 個字節,即只包含成員整形變量 i:
? 因為柔性數組的大小是未知的,因此其大小是動態、可變的,故在給其分配空間時,應當使用 malloc 函數進行動態內存分配。同時因為計算結構大小時沒有計入柔性數組的大小,因此分配的內存大小應當大于結構的大小,才能容納下柔性數組的預期大小:
typedef struct test
{
int i;
int arr[];
}test;
int main()
{
test a;
//定義test類型結構體a
test* p = (test*)malloc(sizeof(test) + 40);
//結構的大小為sizeof(test)的大小,故開辟的動態內存大小應當大于該值
free(p);
p = NULL;
return 0;
}
? 2.柔性數組的使用:? 有了上節課動態內存管理函數的學習,再來研究柔性數組的使用就十分簡單了,我們直接來看示例:
typedef struct test
{
int i;
int arr[];
}test;
int main()
{
test a;
//定義test類型結構體a
test* p = (test*)malloc(sizeof(test) + 40);
//malloc函數的返回值為指針類型,故使用結構體指針test*
//使用malloc函數動態分配空間:test類型結構體的大小(不包含柔性數組) + 40字節
if (p == NULL)
{
perror("malloc");
//判斷動態內存空間是否開辟成功
return 1;
}
//業務處理1:
p->i = 10;
int i = 0;
//給柔性數組元素賦值:
for (i = 0; i< p->i; i++)
{
p->arr[i] = i;
}
//打印柔性數組元素:
for(i=0;ii;i++)
{
printf("%d ", p->arr[i]);
}
printf("\n");
test* pp = (test*)realloc(p, sizeof(test) + 80);
//使用realloc函數將結構指針指向的結構a進行擴容
if (pp == NULL)
{
perror("realloc");
//判斷動態內存空間是否擴容成功
return 1;
}
//業務處理2:
pp->i = 20;
for (i = 0; i< pp->i; i++)
{
pp->arr[i] = i + 9;
}
for (i = 0; i< pp->i; i++)
{
printf("%d ", pp->arr[i]);
}
printf("\n");
free(pp);
pp = NULL;
return 0;
}
? 在這個示例中,我們首先定義了 test 類型結構體 a,接著使用了 malloc 函數為結構體 a 與柔性數組分配了動態存儲空間;接著在判斷非空(動態內存空間分配成功)后給結構體成員 i 與柔性數組 arr 內元素賦值,并進行了打印;再接下來,我們通過使用 realloc 函數將包含柔性數組 arr 的結構體 a 擴容,并在擴容后給結構體內各成員重新賦值并打印;最后釋放使用完畢的動態內存空間并將指針置空:
? 3.柔性數組的優勢:? 但是同時我們又發現,我們使用柔性數組的目的在于希望使結構成員的空間變為動態,可大可小,那么為什么我們不將其寫成指針,由指針成員來指向其它的空間呢?如下:
typedef struct test
{
int i;
int* p;
}test;
int main()
{
test* ptr = (test*)malloc(sizeof(test));
if (ptr == NULL)
{
perror("malloc");
return 1;
}
ptr->p = (int*)malloc(40);
if (ptr->p == NULL)
{
free(ptr);
ptr = NULL;
return 1;
}
return 0;
}
? 我們說,這兩種方法都可以達到我們的要求,實現我們的目的,完成同樣的功能。但是使用柔性數組有兩個顯著的好處:
★ 方便內存釋放。
★?有利于提升訪問速度。
★ 有利于減少內存碎片。
? 使用柔性數組的第一個好處是方便于內存釋放。我們可以想象一下,假如是在我們的程序之中,用戶在完成結構體調用后,可以調用 free 函數將結構體空間進行釋放,那么這個時候,下面這種方法進行了二次空間分配,即使用指針指向了另一塊動態內存空間,我們不能依賴于用戶去發現還有另外一塊動態內存空間需要及時進行釋放,一旦用戶沒有注意,就有可能會造成內存釋放不及時,嚴重時甚至有可能會導致內存泄漏問題的產生。反觀使用柔性數組,只需調用一次 free 函數即可完成內存空間的釋放。
? 使用柔性數組的第二個優勢在于,可以在一定程度上提升我們的內存訪問速度。上面這種方式在進行內存訪問時,由于使用了二次空間分配,則在訪問時的尋址過程中就需要花費更多的時間,而如果我們使用了柔性數組,由于開辟的空間是連續的,在尋址時便可以節省一定的時間。
? 最后一個優點是,有利于減少內存碎片。這個很好理解,使用二次內存分配的方式所申請到的空間是不連續的,就會在內存中產生更多的空隙,就會導致內存空間中產生更多的內存碎片,而使用柔性數組所申請的空間是連續的,則作為一個個整體,就可以減少內存碎片的產生了。
🍒總結🍒:加上今天內容的學習,我們就可以將動態內存空間靈活的運用在我們的程序代碼之中了。并且通過使用并管理動態內存空間,還可以提高我們代碼及程序的靈活性和執行效率,有助于我們寫出更加優秀的程序。所以,掌握好動態內存的管理與柔性數組的使用,對于我們的工作中的許多項目都大有裨益,希望各位小伙伴們下去以后能夠多加練習,切實掌握動態內存管理與柔性數組的相關知識。
🔥🔥有的路,你必須一個人走,這是選擇而非孤獨🔥🔥
更新不易,辛苦各位小伙伴們動動小手,👍三連走一走💕💕 ~ ~ ~? 你們真的對我很重要!最后,本文仍有許多不足之處,歡迎各位認真讀完文章的小伙伴們隨時私信交流、批評指正!
你是否還在尋找穩定的海外服務器提供商?創新互聯www.cdcxhl.cn海外機房具備T級流量清洗系統配攻擊溯源,準確流量調度確保服務器高可用性,企業級服務器適合批量采購,新人活動首月15元起,快前往官網查看詳情吧
本文名稱:【C語言進階】動態內存不知道怎么用?當然是結合柔性數組一起用-創新互聯
URL網址:http://m.newbst.com/article12/dioedc.html
成都網站建設公司_創新互聯,為您提供移動網站建設、ChatGPT、網站內鏈、網站營銷、標簽優化、營銷型網站建設
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯