柔性數組詳解

前言:柔性數組是C99中新添加的概念,它是結構體里面的最后一個成員,因為它的大小未知,所以很靈活,稱之為柔

1 柔性數組占不占結構體的空間呢?

? ?不占

typedef struct Stu
{char y;int x;int arr[];//有些編譯器不支持這樣寫,可以寫成int arr[0],這個就是柔性數組
}St;
int main()
{//這里我們可以計算一下柔性數組到底計不計算空間printf("%d", sizeof(St));//這里涉及結構體的位段后面再說return 0;
}

我們看到結構體的大小是8,所以柔性數組是不占空間的

2 柔性數組怎么用

用動態內存開辟的方式用,我們來結合昨天的動態內存管理設計一下程序

typedef struct Stu
{char y;int x;int arr[];//有些編譯器不支持這樣寫,可以寫成int arr[0],這個就是柔性數組
}St;
int main()
{//這里我們可以計算一下柔性數組到底計不計算空間printf("%d\n", sizeof(St));//這里涉及結構體的位段后面再說St s = { 0 };St* p = NULL;p = &s;p = (St*)malloc(sizeof(int) * 10+sizeof(St));if (p == NULL)return 0;for (int i = 0; i < 10; i++){p->arr[i] = i;printf("%d ", p->arr[i]);}//如果后面要多開辟空間的話p = (St*)realloc(p,sizeof(int) * 15 + sizeof(St));for (int i = 10; i < 15; i++){p->arr[i] = i;printf("%d ", p->arr[i]);}free(p);p = NULL;return 0;
}

3 柔性數組的一種模擬實現(有缺陷,總的來說還是柔性數組好用)

因為柔性數組只需要釋放一次堆區內存,并且柔性數組不占用結構體內存

typedef struct Stu
{char y;int x;int* arr;
}St;int main()
{printf("%d\n", sizeof(St));//指針占用內存空間//先給結構體開辟空間St* p = (St*)malloc(sizeof(St));//然后指針指向的空間開辟p->arr = (int*)malloc(sizeof(int) * 10);//判斷是否為空if (p == NULL || p->arr == NULL)return 1;//不為空繼續下面的程序p->x = 1;p->y = 'w';for (int i = 0; i < 10; i++){p->arr[i] = i;printf("%d ", p->arr[i]);}//用完后記得釋放內存,先釋放小的,再釋放大的//如果你先釋放大的話,那么指針arr沒有了,怎么找arr指向的那塊空間呢?free(p->arr);free(p);//然后置空p->arr = NULL;p = NULL;return 0;
}

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

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

相關文章

數據在內存中的存儲(整型篇)

1.辨析原碼反碼補碼&#xff1a; 1.原碼&#xff1a;有32位&#xff08;int類四個字節&#xff0c;一個字節八個比特位&#xff09;&#xff0c;第一位是符號位&#xff0c;0正1負&#xff0c;其余為二進制位。 2.計算一般是對原碼進行計算&#xff0c;但在負數計算使用原碼會導…

強化學習(二)——Dueling Network(DQN改進)

與DNQ相比&#xff0c;使用優勢函數(A函數)和狀態價值函數&#xff08;V&#xff09;代替之前的Q(動作價值)函數&#xff0c; 最核心公式為 Q ? ( s , a ) A ? ( s , a ) V ? ( s ) ? max ? a A ? ( s , a ) Q^*(s,a)A^*(s,a)V^*(s)-\max_a A^*(s,a) Q?(s,a)A?(s,a)V…

高效利用內存資源之動態內存管理詳解

目錄 一、為什么存在動態內存分配 二、動態內存函數的介紹 2.1malloc 2.2free 2.3calloc 2.4realloc 三、常見的動態內存錯誤 3.1對NULL指針的解引用操作 3.2對動態開辟空間的越界訪問 3.3對非動態開辟內存使用free釋放 3.4使用free釋放一塊動態開辟內存的一部分 3.…

Spring Boot 3 集成 Druid 連接池詳解

在現代的Java應用中&#xff0c;使用一個高效可靠的數據源是至關重要的。Druid連接池作為一款強大的數據庫連接池&#xff0c;提供了豐富的監控和管理功能&#xff0c;成為很多Java項目的首選。本文將詳細介紹如何在Spring Boot 3項目中配置數據源&#xff0c;集成Druid連接池&…

【ACM獨立出版、確定的ISBN號】第三屆密碼學、網絡安全和通信技術國際會議(CNSCT 2024)

第三屆密碼學、網絡安全和通信技術國際會議&#xff08;CNSCT 2024&#xff09; 2024 3rd International Conference on Cryptography, Network Security and Communication Technology 隨著互聯網和網絡應用的不斷發展&#xff0c;網絡安全在計算機科學中的地位越來越重要&…

Android Kotlin 泛型:強大的類型抽象和重用利器

一、什么是泛型&#xff1f; 泛型是一種參數化類型的機制&#xff0c;它允許我們在定義類、接口和方法時使用類型參數&#xff0c;從而實現代碼的重用和類型安全。通過使用泛型&#xff0c;我們可以將類型作為參數傳遞給類或方法&#xff0c;在不同的場景中實現靈活的類型適配…

精選:免費且高效的郵件營銷軟件推薦

好用的郵件營銷軟件可以幫助企業獲取客戶、維系客戶關系。對于有想做郵件營銷想法&#xff0c;但是想先試試的企業來講&#xff0c;免費版郵件營銷軟件就是個不錯的選擇。當然&#xff0c;免費的郵件郵件營銷軟件雖然在價格上有極大的優勢&#xff0c;但是功能上會有各種限制。…

Java生態系統最受歡迎的工具類使用指南 ?

???? 博主貓頭虎(????)帶您 Go to New World??? ?? 博客首頁——????貓頭虎的博客?? ?? 《面試題大全專欄》 ?? 文章圖文并茂??生動形象??簡單易學!歡迎大家來踩踩~?? ?? 《IDEA開發秘籍專欄》 ?? 學會IDEA常用操作,工作效率翻倍~?? ?…

【小白專用】MySQL查詢數據庫所有表名及表結構其注釋

一、先了解下INFORMATION_SCHEMA 1、在MySQL中&#xff0c;把INFORMATION_SCHEMA看作是一個數據庫&#xff0c;確切說是信息數據庫。其中保存著關于MySQL服務器所維護的所有其他數據庫的信息。如數據庫名&#xff0c;數據庫的表&#xff0c;表欄的數據類型與訪問權 限等。在INF…

網絡安全——SSH密碼攻擊實驗

一、實驗目的要求&#xff1a; 二、實驗設備與環境&#xff1a; 三、實驗原理&#xff1a; 四、實驗步驟&#xff1a;? 五、實驗現象、結果記錄及整理&#xff1a; 六、分析討論與思考題解答&#xff1a; 一、實驗目的要求&#xff1a; 1、了解SSH密碼攻擊、FTP密碼攻擊…

【BEV感知 EA-LSS 方案】Edge-aware Lift-splat-shot

前言 本文分享LSS方案的改進方案——EA-LSS,它解決了“深度跳變”問題,提出了一個新框架Edge-aware Lift-splat-shot 。 適用于“多視圖轉BEV”,可以代替原來的LSS模塊,并有效地提高了檢測精度,而推理時間的增加很少。 在nuScenes測試集上驗證,純相機模型或多模態模型…

Jmeter 請求簽名api接口-BeanShell

Jmeter 請求簽名api接口-BeanShell 項目簽名說明編譯擴展jar包jmeter 使用 BeanShell 調用jar包中的簽名方法 項目簽名說明 有簽名算法的api接口本地不好測試&#xff0c;使用BeanShell 擴展jar 包對參數進行簽名&#xff0c;接口簽名算法使用 sha512Hex 算法。簽名的說明如下…

Mybatis是如何進行分頁的?

程序員的公眾號&#xff1a;源1024&#xff0c;獲取更多資料&#xff0c;無加密無套路&#xff01; 最近整理了一份大廠面試資料《史上最全大廠面試題》&#xff0c;Springboot、微服務、算法、數據結構、Zookeeper、Mybatis、Dubbo、linux、Kafka、Elasticsearch、數據庫等等 …

Django系列之Celery異步框架+RabbitMQ使用

在Django項目中&#xff0c;如何集成使用Celery框架來完成一些異步任務以及定時任務呢&#xff1f; 1. 安裝 pip install celery # celery框架 pip install django-celery-beat # celery定時任務使用 pip install django-celery-results # celery存儲結果使用2. Django集成…

gin投票系統3

對應視頻v1版本 1.優化登陸接口 將同步改為異步 原login前端代碼&#xff1a; <!doctype html> <html lang"en"> <head><meta charset"utf-8"><title>香香編程-投票項目</title> </head> <body> <m…

開關量防抖濾波器(梯形圖和SCL源代碼)

模擬量防抖超限報警功能塊請查看下面文章鏈接: https://rxxw-control.blog.csdn.net/article/details/133969425https://rxxw-control.blog.csdn.net/article/details/133969425 1、開關量防抖濾波器 2、防抖濾波 3、梯形圖代碼

useMemo和useCallback

useMemo和useCallback是React中的兩個優化性能的鉤子&#xff08;Hooks&#xff09;。它們都可以用來緩存計算結果&#xff0c;避免在每次渲染時都重新執行耗時的操作。然而&#xff0c;它們的主要區別在于緩存的內容和使用場景。 useMemo useMemo用于緩存那些計算成本較高的值…

2.Feign使用、上下文隔離及源碼閱讀

目錄 概述使用配置pom.xmlfeign 接口編寫controller 測試降級處理pom.xmlapplication.yml代碼 Feign如何初始化及調用源碼閱讀初始化調用 feign的上下文隔離機制源碼 結束 概述 閱讀此文&#xff0c;可以知曉 feign 使用、上下文隔離及源碼閱讀。源碼涉及兩方面&#xff1a;fe…

課后作業7.3.1:構造一個自己的小操作系統

構造一個自己的 mini 操作系統 任務描述 請實現如下功能&#xff1a; 1.寫一個命令解釋器程序 mysh.c &#xff0c;其功能是接收用戶輸入的命令并給出反饋。要求該程序既支持內部命令 cd、sync、exit &#xff1b;也支持外部命令&#xff0c;即可以接收 cat、ls 等命令&#x…

數據結構與算法-Rust 版讀書筆記-2線性數據結構-雙端隊列

數據結構與算法-Rust 版讀書筆記-2線性數據結構-雙端隊列 1、雙端隊列 deque又稱為雙端隊列&#xff0c;雙端隊列是與隊列類似的項的有序集合。deque有兩個端部&#xff1a;首端和尾端。deque不同于隊列的地方就在于項的添加和刪除是不受限制的&#xff0c;既可以從首尾兩端添…