你真的了解C語言中的【柔性數組】嗎~

柔性數組

  • 1. 什么是柔性數組
  • 2. 柔性數組的特點
  • 3. 柔性數組的使用
  • 4. 柔性數組的優勢

1. 什么是柔性數組

也許你從來沒有聽說過柔性數組這個概念,但是它確實是存在的。
C99中,結構體中的最后?個元素允許是未知大小的數組,這就叫做柔性數組成員

例如:

struct S
{int i;int arr[];//柔性數組成員
};

2. 柔性數組的特點

  • 結構體中的柔性數組成員前面必須至少有一個其他成員
  • sizeof返回的這種結構體大小不包括柔性數組的內存。
  • 包含柔性數組成員的結構體用malloc函數進行內存的動態分配,并且分配的內存應該大于結構的大小,以適應柔性數組的預期大小。

例如:

#include <stdio.h>struct S
{int i;int arr[];//柔性數組成員
};int main()
{int sz = sizeof(struct S);printf("%d\n", sz);return 0;
}

輸出結果:

在這里插入圖片描述

3. 柔性數組的使用

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>struct S
{int i;int arr[];//柔性數組成員
};int main()
{//struct S s;//只申請了4字節空間,柔性數組沒有申請空間struct S* ps=(struct S*)malloc(sizeof(struct S) + 40);//40字節是給柔性數組開辟的if (ps == NULL){printf("%s\n", strerror(errno));return 1;}//使用ps->i = 100;int i = 0;for (i = 0; i < 10; i++){ps->arr[i] = i;}for (i = 0; i < 10; i++){printf("%d ", ps->arr[i]);}//調整空間,柔性數組柔性的體現struct S* ptr = (struct S*)realloc(ps, sizeof(struct S) + 80);if (ptr != NULL){ps = ptr;ptr = NULL;}//……//釋放free(ps);ps = NULL;return 0;
}

當前代碼的內存布局如圖所示:
![在這里插入圖片描述](https://img-blog.csdnimg.cn/direct/391dc6b00d254d6d8af2e3542019c372.png

思考:有人會想到那為什么那為什么不直接讓結構體成員為int* ,然后動態開辟一塊空間給int* 指向呢?

代碼實現如下:

#include <stdio.h>
#include <stdlib.h>struct S
{int n;int* arr;
};int main()
{struct S*ps = (struct S*)malloc(sizeof(struct S));if (ps == NULL){return 1;}ps->n = 100;ps->arr = (int*)malloc(40);if (ps->arr == NULL){return 1;}//使用int i = 0;for (i = 0; i < 10; i++){ps->arr[i] = i;}for (i = 0; i < 10; i++){printf("%d ", ps->arr[i]);}//擴容int* ptr = (int*)realloc(ps->arr, 80);if (ptr != NULL){ps->arr = ptr;}//釋放free(ps->arr);free(ps);ps = NULL;return 0;
}

內存布局如圖所示:

在這里插入圖片描述

在結構體中這兩種方式都能實現“柔性”的效果(空間可調整),哪一種方式更好呢?我們進行對比:

在方式1中使用柔性數組時,n和arr的空間只要使用一次malloc就可以全部開辟,最后一次free就可以釋放。

而方式2中struct需要一次malloc開辟,arr又需要malloc開辟,最后也要2次free才可以釋放

我們知道使用malloc的次數越多,如果忘記了free,則就越容易造成內存泄漏,其次就是如果在內存中頻繁的進行malloc,則形成的內存碎片也越多,這樣會使內存的利用率更低。

4. 柔性數組的優勢

  1. 方便內存釋放
    如果我們的代碼是在?個給別人用的函數中,你在里面做了?次內存分配,并把整個結構體返回給用戶。用戶調用free可以釋放結構體,但是用戶并不知道這個結構體內的成員也需要free,所以你不能指望用戶來發現這個事。所以,如果我們把結構體的內存以及其成員要的內存?次性分配好了,并返回給用戶?個結構體指針,用戶做?次free就可以把所有的內存也給釋放掉。

  2. 這樣有利于訪問速度
    連續的內存有益于提高訪問速度,也有益于減少內存碎片。

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

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

相關文章

MyBatis 學習(五)之 高級映射

目錄 1 association 和 collection 介紹 2 案例分析 3 一對一關聯和一對多關聯 4 參考文檔 1 association 和 collection 介紹 在之前的 SQL 映射文件中提及了 resultMap 元素的 association 和 collection 標簽&#xff0c;這兩個標簽是用來關聯查詢的&#xff0c;它們的屬…

算法--時空復雜度分析以及各個數據量對應的可使用的算法(C++;1s內)

這里寫目錄標題 由數據范圍反推算法時間復雜度以及算法內容分析時間復雜度看循環實例1實例2 固定時間復雜度快排和歸并排序二分高精度算法雙指針算法單鏈表插入刪除操作棧和隊列的操作單調棧和單調隊列KMPTire并查集堆哈希表BFS、DFS圖的深度優先、寬度優先遍歷dijkstra算法樸素…

題目 1037: [編程入門]宏定義的練習

問題描述&#xff1a; 輸入兩個整數&#xff0c;求他們相除的余數。用帶參的宏來實現&#xff0c;編程序。 樣例輸入&#xff1a; 3 2 樣例輸出&#xff1a; 1 代碼分析&#xff1a; 這段代碼實現了輸入兩個整數&#xff0c;然后使用帶參數的宏計算它們相除的余數&…

「MySQL」深入理解MySQL中常用的SQL函數

「MySQL」深入理解MySQL中常用的SQL函數 窗口函數參考文章1. COALESCE 函數2. USING 函數3. LEAD 函數4. interval 函數5. INSTR 函數6. substring_index 函數7. LENGTH 函數和 CHAR_LENGTH 函數 窗口函數參考文章 SQL窗口函數 1. COALESCE 函數 COALESCE 函數的作用是從一…

瑞_Redis_Redis的Java客戶端

文章目錄 1 Redis的Java客戶端1.1 Jedis快速入門1.1.1 入門案例1.1.1.1 項目構建1.1.1.2 引入依賴1.1.1.3 建立連接1.1.1.4 釋放資源1.1.1.5 測試1.1.1.6 完整測試類代碼 1.1.2 Jedis連接池1.1.2.1 連接池工具類1.1.2.2 改造原始代碼 &#x1f64a; 前言&#xff1a;本文章為瑞…

基于單片機的聲光控制節能燈設計

摘 要:在當今社會,節約用電是低碳生活的基本行為之一,但是一些公眾場所電力浪費現象依然存在,特別是長明燈、常亮屏等屢見不鮮,造成了嚴重的電力浪費。針對這種電力浪費現象,該文基于STC89C52單片機設計了一種聲光控制節能燈,利用光敏電阻、光信息及語音信號控制電路收集…

常用sql語句及其優化

文章目錄 介紹常用sql語句1. 數據查詢1.1 SELECT 語句1.2 DISTINCT 關鍵字1.3 WHERE 子句1.4 ORDER BY 子句1.5 LIMIT 關鍵字 2. 數據更新2.1 INSERT INTO 語句2.2 UPDATE 語句2.3 DELETE FROM 語句 3. 數據管理3.1 CREATE TABLE 語句3.2 ALTER TABLE 語句3.3 DROP TABLE 語句 …

藍橋輔導之管道

藍橋輔導之管道 核心思想&#xff1a;二分 二分時間 若t時刻成立 則之后也一定成立將mid時刻時每個閥門的水的流動區間加入對組 合并區間 最終判斷是否覆蓋全管道l1 && r m; #include <iostream>#include <cstring>#include <algorithm>#define…

批量自動加好友神器!微信快速擴友秘籍!

對于一些個人或者企業來說&#xff0c;傳統的人工添加好友方式往往會出現效率低下&#xff0c;費時費力的問題。那么&#xff0c;有沒有一種快速、便捷、安全的方式來解決這個問題呢&#xff1f;答案當然是肯定的&#xff0c;那就是通過使用微信管理系統來解決這一問題。 在微…

基于java+springboot景區行李寄存管理系統設計和實現

基于javaspringboot景區行李寄存管理系統設計和實現 博主介紹&#xff1a;多年java開發經驗&#xff0c;專注Java開發、定制、遠程、文檔編寫指導等,csdn特邀作者、專注于Java技術領域 作者主頁 央順技術團隊 Java畢設項目精品實戰案例《1000套》 歡迎點贊 收藏 ?留言 文末獲取…

5GC SBA架構

協議標準&#xff1a;Directory Listing /ftp/Specs/archive/23_series/23.501/ (3gpp.org) NF描述說明NSSFNetwork Slice Selection Function網絡切片選擇&#xff0c;根據UE的切片選擇輔助信息、簽約信息等確定UE允許接入的網絡切片實例。NEF Network Exposure Function網絡開…

疾控中心的污水采樣瓶用的是什么材質

疾控中心的污水采樣瓶采用的材質是聚乙烯或聚丙烯塑料。這種材質的污水采樣瓶具有耐腐蝕、耐高壓、無毒無味、重量輕、易于攜帶等優點。此外&#xff0c;這種材質的污水采樣瓶還可以在高溫下消毒&#xff0c;不會變形或破裂。 疾控中心的污水采樣瓶通常有不同的容積和形狀&…

Harbor高可用(haproxy和keepalived)

Harbor高可用&#xff08;haproxy和keepalived&#xff09; 文章目錄 Harbor高可用&#xff08;haproxy和keepalived&#xff09;1.Harbor高可用集群部署架構1.1 主機初始化1.1.1 設置網卡名和ip地址1.1.2 設置主機名1.1.3 配置鏡像源1.1.4 關閉防火墻1.1.5 禁用SELinux1.1.6 設…

SpringBoot 自定義映射規則resultMap association一對一

介紹 例&#xff1a;學生表&#xff0c;班級表&#xff0c;希望在查詢學生的時候一起返回該學生的班級&#xff0c;而一個實體類封裝的是一個表&#xff0c;如需要多表查詢就需要自定義映射。 表結構 班級表 學生表 SQL語句 SELECT a.id,a.name,a.classes,b.id classes…

Charles抓包 - 安裝、激活、證書配置

最近剛好又遇到了抓包的需求&#xff0c;之前一直使用 Fiddler 抓包&#xff0c;這幾年一直聽大家都在用 Charles 抓包&#xff0c;正好一起了解下&#xff08;一般建議掌握一種抓包方式即可&#xff0c;都可以解決同種需求場景&#xff09; 抓包 Fiddler抓包 Charles 下載、安…

[機器視覺]halcon應用實例 多ROI模板匹配

本示例是單ROI的功能擴展示例&#xff0c;多ROI.后面有空了將出用戶自定義ROI。 比單ROI增加ROI區域的連接和合并。還有for的實例應用。步驟同單ROI一樣。不懂的可以看一下單ROI文章。[機器視覺]halcon應用實例 單ROI模板匹配-CSDN博客 有需要的可以【點贊】【關注】【收藏】…

2024年新提出的算法|LEA愛情進化算法(Love Evolution Algorithm)

Love Evolution Algorithm: a stimulus–value–role theory-inspired evolutionary algorithm for global optimization 愛情進化算法Love Evolution Algorithm&#xff0c;LEA&#xff0c;于2024年2月發表在中科院3區SCI期刊 The Journal of Supercomputing。 1、簡介 本文提…

幸運星數(爺再也不想用pow了)

解法&#xff1a; 暴力 #include <iostream> #include <vector> using namespace std; #define endl \nint main() {ios::sync_with_stdio(false);cin.tie(0); cout.tie(0);int n;long long sum 0, a;cin >> n;for (int i 1; i < n; i) {a 1;for (in…

#python升級#CentOS 7 python升級到3.11.6

在 CentOS 7 上升級 Python 版本可能會比較復雜&#xff0c;因為 CentOS 7 默認安裝的是 Python 2.7&#xff0c;并且系統很多組件依賴于它。不過&#xff0c;可以通過以下步驟嘗試升級到 Python 3.11.6&#xff1a; 安裝必要的依賴&#xff1a; sudo yum install gcc openssl-…

洛谷P1015回文數

題目描述 若一個數&#xff08;首位不為零&#xff09;從左向右讀與從右向左讀都一樣&#xff0c;我們就將其稱之為回文數。 例如&#xff1a;給定一個十進制數 5656&#xff0c;將 5656 加 6565&#xff08;即把 5656 從右向左讀&#xff09;&#xff0c;得到 121121 是一個…