C語言編程C++柔性數(shù)組結(jié)構(gòu)示例講解
繞指柔—柔性數(shù)組
也許你從來沒有聽說過柔性數(shù)組(flexible array)這個概念,但是它確實是存在的。 C99 中,結(jié)構(gòu)體中的最后一個元素允許是未知大小的數(shù)組,這就叫做柔性數(shù)組成員。
柔性數(shù)組的特點:
1.結(jié)構(gòu)中的柔性數(shù)組成員前面必須至少一個其他成員。
2.sizeof 返回的這種結(jié)構(gòu)大小不包括柔性數(shù)組的內(nèi)存。

3.包含柔性數(shù)組成員的結(jié)構(gòu)用malloc ()函數(shù)進行內(nèi)存的動態(tài)分配,并且分配的內(nèi)存應(yīng)該大于結(jié)構(gòu)的大小,以適應(yīng)柔性數(shù)組的預(yù)期大小

那我們?nèi)绾问褂媚?/p>

法一
#include<stdio.h>
#include<stdlib.h>
struct S
{
int a;
int arr[];//未知大小 柔性數(shù)組成員 數(shù)組的大小是可以調(diào)整的
};
int main()
{
//我們怎么開辟呢
//包含柔性數(shù)組成員的結(jié)構(gòu)體的使用,要配合malloc這樣的動態(tài)內(nèi)存分配內(nèi)存函數(shù)使用
struct S* ps = (struct S*)malloc(sizeof(struct S) + 5 * sizeof(int));
//我們?nèi)绾问褂媚?
ps->a = 100;
int i = 0;
for (i = 0; i < 5; i++)
{
ps->arr[i] = i;
}
//還想擴大呢
struct S* ptr = (struct S*)realloc(ps, sizeof(struct S) + 10 * sizeof(int));//先交給ptr,防止內(nèi)存調(diào)整失敗
if (ptr == NULL)//判斷是否開辟成功
{
printf("擴容失敗\n");
return 0;
}
else
{
ps = ptr;
for (int i = 5; i < 10; i++)
{
ps->arr[i] = i;
}
for (int i = 0; i < 10; i++)
{
printf("%d ", ps->arr[i] = i);
}
//用完就釋放
free(ps);
ps = NULL;
}
return 0;
}
法二


#include<stdio.h>
#include<stdlib.h>
struct S
{
int a;
int* parr;
};
int main()
{
//我們怎么開辟呢
struct S* ps = (struct S*)malloc(sizeof(struct S));
//我們?nèi)绾问褂媚?
ps->a = 100;
ps->parr = (int*)malloc(5 * sizeof(int));
int i = 0;
for (i = 0; i < 5; i++)
{
ps->parr[i] = i;
}
//還想擴大呢
int* ptr = (int*)malloc(10 * sizeof(int));//先交給ptr,防止內(nèi)存調(diào)整失敗
if (ptr == NULL)//判斷是否開辟成功
{
printf("擴容失敗\n");
return 0;
}
else
{
ps->parr = ptr;
for (int i = 5; i < 10; i++)
{
ps->parr[i] = i;
}
for (int i = 0; i < 10; i++)
{
printf("%d ", ps->parr[i] = i);
}
//用完就釋放
free(ps->parr);
ps->parr = NULL;
free(ps);
ps = NULL;
}
return 0;
}
那上面那個方法好一點呢
第一個好處是:方便內(nèi)存釋放
如果我們的代碼是在一個給別人用的函數(shù)中,你在里面做了二次內(nèi)存分配,并把整個結(jié)構(gòu)體返回給用戶。用戶調(diào)用free可以釋放結(jié)構(gòu)體,但是用戶并不知道這個結(jié)構(gòu)體內(nèi)的成員也需要free,所以你不能指望用戶來發(fā)現(xiàn)這個事。所以,如果我們把結(jié)構(gòu)體的內(nèi)存以及其成員要的內(nèi)存一次性分配好了,并返回給用戶一個結(jié)構(gòu)體指針,用戶做一次free就可以把所有的內(nèi)存也給釋放掉。
第二個好處是:這樣有利于訪問速度
連續(xù)的內(nèi)存有益于提高訪問速度,也有益于減少內(nèi)存碎片。(其實,我個人覺得也沒多高了,反正你跑不了要用做偏移量的加法來尋址)
總結(jié)
第一種好,不好的話,要柔性數(shù)組干嗎?是不是
何意百煉剛,化為繞指柔
首先說明一下我不軟弱,只是單純覺得這句詩好玩,我不認為這首詩是軟弱的詩我有自己的見解。說軟弱的只能說不要你想的就是你想的。
以上就是C語言編程之柔性數(shù)組示例講解的詳細內(nèi)容,更多關(guān)于C語言柔性數(shù)組的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C語言中結(jié)構(gòu)體(struct)的幾種初始化方法
相信大家都知道struct結(jié)構(gòu)體是C語言中非常重要的復(fù)合類型,初始化的方法很多,那么小編下面對這些方法進行總結(jié),便于自己和大家以后查閱,有需要的可以參考借鑒。2016-08-08
C/C++ Qt 基本文件讀寫的基本使用(2種實現(xiàn))
文件的讀寫是很多應(yīng)用程序具有的功能,本文主要介紹了兩種實現(xiàn)方法,第一種使用QFile類的IODevice讀寫功能直接讀寫,第二種是利用 QFile和QTextStream結(jié)合起來,用流的方式進行文件讀寫2021-11-11

