日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當前位置:首頁 > 嵌入式 > 嵌入式大雜燴
[導讀]柔性數組在實際中應用還是挺多的,看過上一篇文章分享一種靈活性很高的協議格式(附代碼例子)的小伙伴不知有沒有注意到我們有使用了柔性數組:

柔性數組在實際中應用還是挺多的,看過上一篇文章分享一種靈活性很高的協議格式(附代碼例子)的小伙伴不知有沒有注意到我們有使用了柔性數組:

本篇文章我們就來一起學習柔性數組。

什么是柔性數組?

C99中,結構體中的最后一個元素允許是未知大小的數組,這就叫作 柔性數組 。

柔性數組的特點:

  • 結構體中柔性數組成員前面必須至少有一個其他成員。
  • sizeof返回的這種結構大小不包括柔性數組的內存。
  • 包含柔性數組成員的結構用malloc()函數進行內存的動態(tài)分配。

例子:

// 微信公眾號:嵌入式大雜燴 #include   #include  #include  typedef struct _data { int len; char val[];
}data_t; int main(int arc, char *argv[]) { data_t test_data1 = {0}; printf("sizeof(data_t) = %ld\n", sizeof(data_t)); char *src_data = "hello flexible arr"; // 為結構體及其柔性數組成員申請一塊連續(xù)的空間 int len = strlen(src_data) + 1; data_t *p_test_data2 =(data_t*)malloc(sizeof(data_t) + sizeof(char) * len); if (NULL == p_test_data2)
    { printf("malloc p_test_data2 error\n"); return EXIT_FAILURE;
    } // 填充結構體 p_test_data2->len = len; strncpy(p_test_data2->val, src_data, p_test_data2->len); printf("p_test_data2->val = %s\n", p_test_data2->val); // 釋放內存 free(p_test_data2);
    p_test_data2 = NULL; return 0;
}

編譯、運行:

下面我們一起通過實例來認識柔性數組的優(yōu)點。

柔性數組與指針的區(qū)別?

上一節(jié)的協議格式結構體其實可以又如下兩種創(chuàng)建方式:

  • value字段以柔性數組的方式定義:
typedef struct _protocol_format { uint16_t head; uint8_t id; uint8_t type; uint8_t length; uint8_t value[];
}protocol_format_t;
  • value字段以指針的方式定義:
typedef struct _protocol_format { uint16_t head; uint8_t id; uint8_t type; uint8_t length; uint8_t *value;
}protocol_format_t;

(1)結構體占用空間

柔性數組的方式結構體占用較指針的方式少。

柔性數組方式:

指針方式:

(2)代碼簡潔及訪問速度方面

柔性數組的方式相對與指針的方式更為簡潔,柔性數組的方式只需要申請一次空間,給結構體申請空間的同時也給柔性數組申請空間;而指針的方式,除了給結構體申請空間之外,還得給結構體里的指針成員申請空間。

柔性數組方式:

指針方式:

使用指針的方式寫代碼會比柔性數組的方式會繁瑣一些,特別地,如果在釋放內存的時候把順序弄反了,則結構體里的指針成員所指向的內存就釋放不掉,會造成內存泄露。

柔性數組的方式只需要申請一次空間,是一塊連續(xù)的空間;而指針的方式,申請的兩塊空間不是連續(xù)的。連續(xù)的內存有益于提高訪問速度。

當然,前面介紹柔性數組的時候有說到,柔性數組是在C99標準及之后才有的,如果你的編譯器還是比較古老的,那還是選用指針的方式,通用性也會比較好。

以上就是本次的分享,期待你的點贊、收藏、轉發(fā)!

注意

由于微信公眾號近期改變了推送規(guī)則,為了防止找不到,可以星標置頂,這樣每次推送的文章才會出現在您的訂閱列表里。

猜你喜歡:

分享一種靈活性很高的協議格式(附代碼例子)

嵌入式大雜燴周記 | 第 15 期

訪問非法內存為什么不會出錯?

嵌入式大雜燴周記 | 第 14 期

分享幾個實用的代碼片段(第二彈)

分享一種你可能不知道的bug定位方法

分享一種修改配置文件的方法

《嵌入式大雜燴周記第 13 期:lz4》

《嵌入式并行多線程處理器,了解一下!》

《分享一種修改配置文件的方法》

《分享幾個實用的代碼片段(附代碼例子)》

《廢舊板子再利用:搭建無線調試環(huán)境!》

《嵌入式段錯誤的3種調試方法匯總!》

《簡說TCP通信非阻塞接收(附代碼例子)》

《TCP通信常用接口的使用封裝》

《寫國際化的嵌入式代碼,時間問題如何處理?》

《Linux命令行萬能解壓命令》

《嵌入式軟件中,總線錯誤的坑?替大家先踩一步》

《分享嵌入式軟件調試方法及幾個有用的工具!》

《分享兩點提高編程能力的建議!》


在公眾號聊天界面回復1024,可獲取嵌入式資源;回復 m ,可查看文章匯總

本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯系該專欄作者,如若文章內容侵犯您的權益,請及時聯系本站刪除。
換一批
延伸閱讀

LED驅動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: 驅動電源

在工業(yè)自動化蓬勃發(fā)展的當下,工業(yè)電機作為核心動力設備,其驅動電源的性能直接關系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護是驅動電源設計中至關重要的兩個環(huán)節(jié),集成化方案的設計成為提升電機驅動性能的關鍵。

關鍵字: 工業(yè)電機 驅動電源

LED 驅動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設備的使用壽命。然而,在實際應用中,LED 驅動電源易損壞的問題卻十分常見,不僅增加了維護成本,還影響了用戶體驗。要解決這一問題,需從設計、生...

關鍵字: 驅動電源 照明系統(tǒng) 散熱

根據LED驅動電源的公式,電感內電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關鍵字: LED 設計 驅動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產業(yè)的重要發(fā)展方向。電動汽車的核心技術之一是電機驅動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機驅動系統(tǒng)中的關鍵元件,其性能直接影響到電動汽車的動力性能和...

關鍵字: 電動汽車 新能源 驅動電源

在現代城市建設中,街道及停車場照明作為基礎設施的重要組成部分,其質量和效率直接關系到城市的公共安全、居民生活質量和能源利用效率。隨著科技的進步,高亮度白光發(fā)光二極管(LED)因其獨特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關鍵字: 發(fā)光二極管 驅動電源 LED

LED通用照明設計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數校正(PFC)、空間受限和可靠性等。

關鍵字: LED 驅動電源 功率因數校正

在LED照明技術日益普及的今天,LED驅動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關鍵字: LED照明技術 電磁干擾 驅動電源

開關電源具有效率高的特性,而且開關電源的變壓器體積比串聯穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機重量也有所下降,所以,現在的LED驅動電源

關鍵字: LED 驅動電源 開關電源

LED驅動電源是把電源供應轉換為特定的電壓電流以驅動LED發(fā)光的電壓轉換器,通常情況下:LED驅動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: LED 隧道燈 驅動電源
關閉