C語(yǔ)言冷門知識(shí)之你可能沒(méi)聽過(guò)的柔性數(shù)組
一、簡(jiǎn)述
在c99中有明確的規(guī)定允許結(jié)構(gòu)體中最后一個(gè)數(shù)組大小是未知的。
柔性數(shù)組其實(shí)是結(jié)構(gòu)體中的最后一個(gè)數(shù)組未說(shuō)明大小,且結(jié)構(gòu)體中至少包含一個(gè)以上其他類型,如
#include<stdio.h>
struct hei
{
int zeng;
char shi;
int arr[];//或者int arr[0];
}ma;
int main()
{
struct hei ma;
return 0
}
二、具體使用
1.用創(chuàng)建柔性數(shù)組的方法:
#include<stdio.h>
#include<stdlib.h>
#include<stdlib.h>//或者是#include<malloc.h>動(dòng)態(tài)內(nèi)存函數(shù)的頭文件
struct d
{
int nb;
int nn;
int arr[];
};
int main()
{
struct d *p=(struct d*)malloc(sizeof(struct d)+5*sizeof(int));//分別給結(jié)構(gòu)體中的除了柔
//性數(shù)組的其他類型和給柔性數(shù)組申請(qǐng)空間
p->nb=100;
p->nn=50;
for(int i=0;i<5;i++)
{
p->arr[i]=i;//賦值
printf("%d ",p->arr[i]);
}
struct d *pp=(struct d*)realloc(p,48); //重新調(diào)整所申請(qǐng)的空間,將柔性數(shù)組調(diào)整為40。
if(pp!=NULL)
{
p=pp;
for(i=5;i<10;i++)
{
p->arr[i]=i;//賦值
printf("%d ",p->arr[i]);
}
free(p);
p=NULL;
}
return 0;
}
2.用普通的寫法
#include<stdio.h>
#include<stdlib.h>
struct bb
{
int a;
int *arr;
};
int main()
{
struct bb* p=(struct bb*)malloc(sizeof(struct bb));
p->a=20;
p->arr=(int*)malloc(5*sizeof(int));
for(int i=0;i<5;i++)
{
p->arr[i]=i;
printf("%d ",p->arr[i]);
}
int *ptr=(int*)realloc(p->arr,40);
if(pp!=NULL)
{
p->arr=ptr;
for(int i=5;i<10;i++)
{
int t=p->arr[i]=i;
printf("%d ",t);
}
}
free(p->arr);
p->arr=NULL;
free(p);
p=NULL;
return 0;
}
三、柔性數(shù)組的特點(diǎn)
1.對(duì)比這兩種來(lái)看,柔性數(shù)組的特點(diǎn)在于只需要用一次malloc創(chuàng)建就可以,而普通的解法則需要兩
次,因?yàn)閙alloc申請(qǐng)的內(nèi)存位置是任意的,所以柔性數(shù)組可以減少內(nèi)存碎片化。
2.柔性數(shù)組申請(qǐng)的內(nèi)存更加集中,有利于查找使用。
3.sizeof求結(jié)構(gòu)體大小時(shí)所求出的大小沒(méi)有包括柔性數(shù)組的大小。
4.用malloc函數(shù)進(jìn)行動(dòng)態(tài)內(nèi)存申請(qǐng)時(shí),柔性數(shù)組的大小應(yīng)該大于結(jié)構(gòu)體的大小
以便于柔性數(shù)組適應(yīng)預(yù)期大小。
5.柔性數(shù)組只用一次開辟,有利于提高訪問(wèn)速度
------------------------------------------------------------------------------------------------------------------
小伙伴們有什么想法可以留言
到此這篇關(guān)于C語(yǔ)言冷門知識(shí)之你可能沒(méi)聽過(guò)的柔性數(shù)組的文章就介紹到這了,更多相關(guān)C語(yǔ)言 柔性數(shù)組內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
VisualStudio2022下配置 OpenMP多線程編程環(huán)境與運(yùn)行
本文主要介紹了VisualStudio2022下配置 OpenMP多線程編程環(huán)境與運(yùn)行,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-06-06
c++中虛函數(shù)和純虛函數(shù)的作用與區(qū)別
這篇文章主要介紹了c++中虛函數(shù)和純虛函數(shù)的作用與區(qū)別,需要的朋友可以參考下2014-07-07
C語(yǔ)言實(shí)現(xiàn)二叉樹的搜索及相關(guān)算法示例
這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)二叉樹的搜索及相關(guān)算法,結(jié)合具體實(shí)例形式分析了基于C語(yǔ)言創(chuàng)建、遍歷、搜索等相關(guān)算法與實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-06-06
C++ 模擬實(shí)現(xiàn)list(迭代器)實(shí)現(xiàn)代碼
這篇文章主要介紹了C++ 模擬實(shí)現(xiàn)list(迭代器)實(shí)現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下2017-05-05
C++11?condition_variable條件變量的用法說(shuō)明
這篇文章主要介紹了C++11?condition_variable條件變量的用法說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07
一文學(xué)會(huì)c語(yǔ)言結(jié)構(gòu)體的定義和使用方法
數(shù)組是一種數(shù)據(jù)形式,其特點(diǎn)是多個(gè)相同類型的元素集合起來(lái),結(jié)構(gòu)體是另一種重要的數(shù)據(jù)形式,特點(diǎn)是將不同類型的成員組合起來(lái),下面這篇文章主要給大家介紹了關(guān)于c語(yǔ)言結(jié)構(gòu)體的定義和使用方法的相關(guān)資料,需要的朋友可以參考下2022-11-11

