C語言---番外篇(柔性數組)

前言:

? ? ? ? 由于這塊內容所謂綜合性比較高,有數組的知識,有結構體的知識,還有動態內存管理的知識,所以我就單獨寫一篇博客,此謂番外篇。

柔性數組的概念

? ? ? ? 定義在結構體的最后一個元素的位置且大小未知的數組就叫柔性數組。

#include<stdio.h>
#include<stdlib.h>
struct test1
{int n;int arr[];//柔性數組
};struct test2
{int n;int arr[0];//柔性數組
};int main()
{return 0;
}

? ? ? ? 以上這兩種定義的方式都是柔性數組,但可能有的編譯器上并不是兩種情況都支持。

柔性數組的特點

? ? ? ? 1.柔性數組的成員前邊必須要有別的成員。

? ? ? ? 2.sizeof返回這種結構體的大小不會包括柔性數組的內存

? ? ? ? 3.必須要和動態內存分配(malloc函數等)一起結合使用。并且在動態分配內存大小的時候給柔性數組預留大小。

柔性數組的使用

? ? ? ? 如果有結構體或者動態內存管理等相關知識不知道的,可以去看一下我寫的博客,鏈接如下。

????????C語言---自定義類型(上)(結構體類型)-CSDN博客

????????C語言---動態內存管理-CSDN博客

????????大家簡單看一下我下邊的代碼(代碼1)示例就懂柔性數組的基本使用了。

#include<stdio.h>
#include<stdlib.h>
struct test
{int n;int arr[];
};int main()
{//動態申請空間//前邊半部分是給除去柔性數組的其他成員在堆區分配空間,后半部分申請的空間就給到的是結構體struct test* pt = (struct test*)malloc(sizeof(struct test) + 5 * sizeof(int));if (pt == NULL){//進入表示開辟空間失敗perror("malloc");return 1;}//使用pt->n = 10;for (int i = 0; i < 5; i++){pt->arr[i] = i + 1;}//空間不夠擴容struct test* ptr = (struct test*)realloc(pt, sizeof(struct test) + 10 * sizeof(int));if (ptr == NULL){perror("realloc");return 1;}pt = ptr;ptr = NULL;//釋放空間free(pt);pt = NULL;return 0;
}

? ? ? ? 下邊來看看內存里邊大概是什么樣子的

柔性數組的優勢

? ? ? ? 先來看一下下邊的代碼(代碼2),可以產生與剛才的柔性數組一樣的效果。

#include<stdio.h>
struct test2
{int n;int* arr;//arr指針可以指向一塊空間
};int main()
{//申請空間//給結構體整體分配空間struct test2* pt = (struct test2*)malloc(sizeof(struct test2));if (pt == NULL){perror("malloc1");return 1;}//使用pt->n = 10;//另外開辟一塊空間讓arr指針指向它pt->arr = (int*)malloc(5 * sizeof(int));if (pt->arr == NULL){perror("malloc2");return 1;}//使用arr指向的空間for (int i = 0; i < 5; i++){pt->arr[i] = i + 1;}//空間不夠擴容int* ptr = (int*)realloc(pt->arr, 10 * sizeof(int));if (ptr == NULL){perror("realloc");return 1;}pt->arr = ptr;ptr = NULL;//使用................//釋放//兩次釋放,先釋放arr指向的空間,再釋放結構體的空間free(pt->arr);pt->arr = NULL;free(pt);pt = NULL;return 0;
}

? ? ? ? 代碼2的內存結構大致如下圖

? ? ? ? 代碼1和代碼2有相同的效果,但很明顯用代碼1會更加好一點,也就是用柔性數組會更好一些,它的優勢就是減少了內存碎片,提高訪問速度,內存碎片就是指的每次動態內存申請的時候每一塊空間之間的被浪費的間隙空間(不理解也沒事),用柔性數組最大的好處就是方便內存釋放,只需要free一次。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/92357.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/92357.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/92357.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

單片機的幾種GPIO輸入輸出模型詳解

模式選擇匯總參考表&#xff1a;模式輸出驅動輸入阻抗默認狀態典型應用場景推挽輸出強驅動禁用可配置LED, SPI, 高速信號開漏輸出弱驅動禁用低/懸空IC, 電平轉換, 線與浮空輸入禁用極高不確定外部強驅動信號上拉輸入禁用中高高電平按鍵(接地型), 數字輸入下拉輸入禁用中高低電平…

深度解析ECharts.js:構建現代化數據可視化的利器

引言&#xff1a;數據可視化的新時代挑戰 在數字化轉型浪潮中&#xff0c;數據可視化已成為企業決策和用戶體驗的關鍵環節。面對海量數據的呈現需求&#xff0c;傳統表格已無法滿足用戶對直觀洞察的渴求。作為百度開源的JavaScript可視化庫&#xff0c;ECharts.js憑借其強大的功…

從零構建實時通信引擎:Freeswitch源碼編譯與深度優化指南

一、構建工具&#xff1a;編譯FreeSWITCH及其依賴庫的基礎 1. CMake2. Autoconf 二、匯編器&#xff1a;提升音視頻處理性能 3. YASM / NASM 三、音視頻編解碼器&#xff1a;支撐實時媒體傳輸 4. Opus5. x264 (可選)6. libvpx / libvpx2 (可選) 四、多媒體框架與工具庫&#xf…

網絡原理 HTTP 和 HTTPS

目錄 一 . HTTP 協議 二 . 抓包 三 . HTTP 請求 / 響應的基本格式 &#xff08;1&#xff09;HTTP請求的基本格式 &#xff08;2&#xff09;HTTP響應的基本格式 四 . HTTP 方法 GET 和 POST 的區別&#xff1a; 五 . 請求報頭和響應報頭 &#xff08;1&#…

基于單片機的自動條幅懸掛機

摘 要 隨著日新月異科技發展&#xff0c;在心率體溫測量方面&#xff0c;我們取得了迅速的發展&#xff0c;就近日而言&#xff0c;脈搏測量儀已經在多個領域大展身手&#xff0c;除了在醫學領域有所建樹&#xff0c;在人們的日常生活方面的應用也不斷拓展&#xff0c;如檢疫…

《C++》面向對象編程--類(中)

文章目錄一、構造函數1.1定義1.2語法1.3特性二、析構函數2.1定義2.2語法2.3特性三、拷貝構造函數3.1定義3.2語法3.3特性3.4淺拷貝3.4.1定義3.4.2淺拷貝的風險3.5深拷貝一、構造函數 1.1定義 在C中&#xff0c;構造函數&#xff08;Constructor&#xff09; 是一種特殊的成員函…

機器學習初學者理論初解

大家好! 為什么手機相冊能自動識別人臉&#xff1f;為什么購物網站總能推薦你喜歡的商品&#xff1f;這些“智能”背后&#xff0c;都藏著一位隱形高手——機器學習&#xff08;Machine Learning&#xff09;。一、什么是機器學習&#xff1f;簡單說&#xff0c;機器學習是教計…

原碼反碼補碼

在Java中&#xff0c;無論是小數還是整數&#xff0c;他們都要帶有符號&#xff08;和C語言不同&#xff0c;C語言有無符號數&#xff09;。首位就作為符號位。原碼反碼&#xff1a;正數的反碼是其原碼本身負數的反碼是在其原碼的基礎上, 符號位不變&#xff0c;其余各個位取反…

使用ubuntu:20.04和ubuntu:jammy構建secretflow環境

一、使用ubuntu:20.04構建隱語編譯環境FROM ubuntu:20.04LABEL maintainer"build SecureProtocolLib on ubuntu:20.04"ARG TARGETPLATFORM# change dash to bash as default shell RUN ln -sf /bin/bash /bin/shRUN apt update \&& apt upgrade -y \&&am…

Hinge Loss(鉸鏈損失函數)詳解:SVM 中的關鍵損失函數

&#x1f4cc; 一、什么是 Hinge Loss&#xff1f;Hinge Loss&#xff08;鉸鏈損失&#xff09;&#xff0c;是 支持向量機&#xff08;SVM, Support Vector Machine&#xff09; 中常用的一種損失函數&#xff0c;用于最大間隔分類。其核心思想是&#xff1a;當預測結果已經正…

days32 :零基礎學嵌入式之網絡2.0

一、wireshark &#xff1a;網絡抓包工具1.功能&#xff1a;抓取通過電腦網卡的網絡數據2.作用&#xff1a;排查故障、抓取數據做數據分析、3.用法&#xff1a;&#xff08;1&#xff09;sudo wireshark&#xff08;2&#xff09;選擇需要抓取的網卡》any&#xff08;3&#xf…

數字護網:一次深刻的企業安全體系靈魂演練

&#x1f9e9; 引言&#xff1a;什么是“護網”&#xff1f;—— 不止是攻防&#xff0c;更是企業安全能力的年度大考 每年&#xff0c;由國家相關部門牽頭的“護網行動”都如期而至&#xff0c;各大企事業單位的安全團隊也隨之進入高度戒備狀態。然而&#xff0c;“護網”遠非…

基于 NumPy 的高效數值計算技術解析與實踐指引

在數據處理與科學計算領域&#xff0c;高效是核心訴求。NumPy 作為 Python 生態高效數值計算的基石&#xff0c;以高性能多維數組對象及配套函數&#xff0c;成為數據從業者的必備工具。其數組支持算術、比較、邏輯等豐富運算&#xff0c;通過向量化操作直接處理每個元素&#…

Kafka MQ 控制器 broker

Kafka MQ 控制器 broker 1 控制器broker的選舉 在 Kafka 集群中會有一個或多個 broker,其中有一個 broker 會被選舉為控制器(Kafka Controller)?,它負責管理整個集群中所有分區和副本的狀態。當某個分區的leader副本出現故障時,由控制器負責為該分區選舉新的leader副本…

50天50個小項目 (Vue3 + Tailwindcss V4) ? | ImageCarousel(圖片輪播組件)

&#x1f4c5; 我們繼續 50 個小項目挑戰&#xff01;—— ImageCarousel組件 倉庫地址&#xff1a;https://github.com/SunACong/50-vue-projects 項目預覽地址&#xff1a;https://50-vue-projects.vercel.app/ 使用 Vue 3 的 <script setup> 語法以及 Tailwind CSS …

基于springboot的智能物流管理系統(源碼+論文)

一、開發環境 MYSQL數據庫 MySQL是一個真正的多用戶、多線程SQL數據庫服務器&#xff0c;基于SQL的客戶/服務器模式的關系數據庫管理系統。其特點包括&#xff1a; 功能強大&#xff1a;支持多用戶、多線程操作。使用簡單&#xff1a;管理方便&#xff0c;安全可靠性高。跨平…

Collection接口的詳細介紹以及底層原理——包括數據結構紅黑樹、二叉樹等,從0到徹底掌握Collection只需這篇文章

目錄 Collection簡介 Collection的遍歷方式 迭代器遍歷 增強for遍歷 Lambda表達式遍歷 List集合 List集合的遍歷方式 列表迭代器遍歷以及普通for循環 數據結構 棧 隊列 數組 鏈表 單向鏈表 雙向鏈表 二叉樹 遍歷方式 普通二叉樹 二叉查找樹 平衡二叉樹 旋轉…

《安順棒壘球》世界十大運動·棒球1號位

Worlds Top 10 Sports for Newbies | 棒球排第幾&#xff1f; 全球青訓體系大揭秘 ?添加圖片注釋&#xff0c;不超過 140 字&#xff08;可選&#xff09;神王棒球世界十大運動排名 Top 10 Global Sports&#xff08;按參與度/商業價值/影響力綜合排序&#xff09;足球 Footba…

什么是“差分“?

1. 什么是"差分"&#xff1f;想象兩個人在玩蹺蹺板&#xff1a;當兩人同時向上跳&#xff08;同向移動&#xff09;→ 蹺蹺板不動 → 這叫"共模"當一人向上&#xff0c;另一人向下&#xff08;反向移動&#xff09;→ 蹺蹺板傾斜 → 這叫"差分"差…

4.組合式API知識點(2)

10 組合式API - 模版引用模板引用的概念如何使用&#xff08;以獲取dom為例 組件同理&#xff09;組件實例對象defineExpose()11 組合式API - provide和inject作用和場景跨層傳遞普通數據跨層傳遞響應式數據跨層傳遞方法需求解決思考