網站首頁 編程語言 正文
什么是柔性數組
柔性數組是在C99中定義的
結構體的最后一個元素允許是未知大小的數組,這就叫柔性數組
柔性數組的長度可以寫成0,也可以不規定數組長度
下面兩種寫法都是正確的
struct S
{
int i;
int a[0];//柔性數組成員
}
struct S
{
int i;
int a[];//柔性數組成員
}
- 結構體中的柔性數組成員前面至少有一個其他成員
- sizeof返回的這種結構體的大小不包括柔性數組的大小
- 包含柔性數組成員的結構體用malloc ()函數進行內存的動態分配,并且分配的內存應該大于結構的大
小,以適應柔性數組的預期大小。
柔性數組的使用
typedef struct S
{
int i;
char c[];//c是柔性數組
}S;
int main()
{
S* p = (S*)malloc(sizeof(S) + 10 * sizeof(char));
if (p == NULL)
{
perror("malloc");
return 1;
}
p->i = 10;
for (int i = 0; i < 10; i++)
{
p->c[i] = 'a';
}
free(p);
p = NULL;
return 0;
}
在malloc開辟空間時,開辟空間大小為sizeof(S) + 10 * sizeof(char),前面的sizeof(S)其實是表示結構體中int i的大小,后面則是給c開辟了10個字節大小的連續空間
如果覺得前面開辟空間小了,數組c不夠長,還可以用realloc函數對內存大小進行調整
int main()
{
S* p = (S*)malloc(sizeof(S) + 10 * sizeof(char));
if (p == NULL)
{
perror("malloc");
return 1;
}
p->i = 10;
S* ptr = (S*)realloc(p, sizeof(S) + 20 * sizeof(char));
if (ptr == NULL)
{
perror("realloc");
return 1;
}
p = ptr;
for (int i = 0; i < 20; i++)
{
p->c[i] = 'a';
}
free(p);
p = NULL;
return 0;
}
其實我們也可以寫出另一種形式的結構體,它的功能與柔性數組類似
typedef struct S2
{
it i;
char* c;
}S2;
對于這個結構體的使用如下:
int main()
{
S2* p = (S2*)malloc(sizeof(S2));
p->i = 10;
p->c = (char*)malloc(10 * sizeof(char));
for (int i = 0; i < 10; i++)
{
p->c[i] = 'a';
}
free(p->c);
p->c = NULL;
free(p);
p = NULL;
return 0;
}
為了使用這個結構體,需要先給結構體開辟一個空間S2* p = (S2*)malloc(sizeof(S2));然后再需要動態開辟一個塊空間讓c指向
這種寫法需要開辟2次內存,同樣在最后釋放內存是,也需要free2次
所以就可以看出柔性數組的好處:
第 一個是方便內存釋放
因為不論是我們在使用時或給別人寫一個函數讓別人使用時,如果在里面做了二次內存分配,可能別人使用時并不會知道結構體內部還有一個成員需要釋放。所以就需要把內存一次性分配好,在最后釋放一次內存就可以了
第二個是加快訪問
如果二次內存分配,就會在內存中產生一些內存碎片,這樣即浪費了空間也不利于訪問
原文鏈接:https://blog.csdn.net/weixin_64116522/article/details/128982081
相關推薦
- 2022-03-29 PostgreSQL13基于流復制搭建后備服務器的方法_PostgreSQL
- 2022-03-28 一篇文章帶你學習python的函數與類_python
- 2022-05-25 ASP.NET?Core中使用Redis實現緩存_實用技巧
- 2022-11-18 關于python中第三方庫交叉編譯的問題_python
- 2023-03-23 Nginx實現http自動跳轉到https_nginx
- 2022-07-27 flask實現python方法轉換服務的方法_python
- 2022-10-09 ASP.NET?Core?5.0中的Host.CreateDefaultBuilder執行過程解析_
- 2022-06-18 Elasticsearch之倒排索引及索引操作_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支