深入了解一下C語言中的柔性數(shù)組
什么是柔性數(shù)組
柔性數(shù)組是在C99中定義的
結構體的最后一個元素允許是未知大小的數(shù)組,這就叫柔性數(shù)組
柔性數(shù)組的長度可以寫成0,也可以不規(guī)定數(shù)組長度
下面兩種寫法都是正確的
struct S
{
int i;
int a[0];//柔性數(shù)組成員
}
struct S
{
int i;
int a[];//柔性數(shù)組成員
}
- 結構體中的柔性數(shù)組成員前面至少有一個其他成員
- sizeof返回的這種結構體的大小不包括柔性數(shù)組的大小
- 包含柔性數(shù)組成員的結構體用malloc ()函數(shù)進行內(nèi)存的動態(tài)分配,并且分配的內(nèi)存應該大于結構的大
小,以適應柔性數(shù)組的預期大小。
柔性數(shù)組的使用
typedef struct S
{
int i;
char c[];//c是柔性數(shù)組
}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個字節(jié)大小的連續(xù)空間
如果覺得前面開辟空間小了,數(shù)組c不夠長,還可以用realloc函數(shù)對內(nèi)存大小進行調(diào)整
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;
}
其實我們也可以寫出另一種形式的結構體,它的功能與柔性數(shù)組類似
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));然后再需要動態(tài)開辟一個塊空間讓c指向
這種寫法需要開辟2次內(nèi)存,同樣在最后釋放內(nèi)存是,也需要free2次
所以就可以看出柔性數(shù)組的好處:
第 一個是方便內(nèi)存釋放
因為不論是我們在使用時或給別人寫一個函數(shù)讓別人使用時,如果在里面做了二次內(nèi)存分配,可能別人使用時并不會知道結構體內(nèi)部還有一個成員需要釋放。所以就需要把內(nèi)存一次性分配好,在最后釋放一次內(nèi)存就可以了
第二個是加快訪問
如果二次內(nèi)存分配,就會在內(nèi)存中產(chǎn)生一些內(nèi)存碎片,這樣即浪費了空間也不利于訪問
到此這篇關于深入了解一下C語言中的柔性數(shù)組的文章就介紹到這了,更多相關C語言柔性數(shù)組內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
C++11 lambda表達式在回調(diào)函數(shù)中的使用方式
這篇文章主要介紹了C++11 lambda表達式在回調(diào)函數(shù)中的使用方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-11-11
C語言時間函數(shù)之mktime和difftime詳解
這篇文章主要為大家詳細介紹了C語言時間函數(shù)之mktime和difftime,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一,希望能夠給你帶來幫助2022-02-02

