C語言?柔性數(shù)組的使用詳解
一.柔性數(shù)組的特點(diǎn)
struct S
{
int x;
int a[];
};
int main()
{
printf("%d", sizeof(S));
}這段代碼的輸出是什么?
我們打印結(jié)構(gòu)體S所占空間的大小,這個a[]占多少字節(jié)呢?
輸出結(jié)果是4,可一個int類型的x就是4了,a[]去哪了?好奇怪哦。
原來,這是一種柔性數(shù)組。
1.結(jié)構(gòu)體中最后一個元素允許是未知大小的數(shù)組,這個數(shù)組就是柔性數(shù)組。
2.結(jié)構(gòu)中的柔性數(shù)組前面必須有至少一個其他成員。
3.sizeof返回的這種結(jié)構(gòu)大小不包括柔性數(shù)組的內(nèi)存。
4.包含柔數(shù)組成員的結(jié)構(gòu)用malloc函數(shù)進(jìn)行內(nèi)存的動態(tài)分配,且分配的內(nèi)存應(yīng)該大于結(jié)構(gòu)的大小,以適應(yīng)柔性數(shù)組的預(yù)期大小。
二.柔性數(shù)組的使用
1.如何使用柔性數(shù)組
包含柔數(shù)組成員的結(jié)構(gòu)用malloc函數(shù)進(jìn)行內(nèi)存的動態(tài)分配,
且分配的內(nèi)存應(yīng)該大于結(jié)構(gòu)的大小,以適應(yīng)柔性數(shù)組的預(yù)期大小。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
struct S
{
int x;
int a[];
};
int main()
{
//為柔性數(shù)組a[]開辟了40個字節(jié)的空間
struct S *ps =(struct S*)malloc(sizeof(struct S) + 40);
if (ps == NULL) //檢查是否為空指針
{
perror("ps");
return 1;
}
ps->x = 10;
int i = 0;
for (i = 0; i < 10; i++)
{
ps->a[i] = i; //數(shù)組使用
}
for (i = 0; i < 10; i++)
{
printf("%d ",ps->a[i]); //數(shù)組打印
}
//若覺得40不夠用,可用realloc擴(kuò)容
//如:
struct S* ptr = (struct S*)realloc(ps, sizeof(struct S) + 80);
if (ptr == NULL) //檢查是否為空指針
{
perror("realloc");
return 1;
}
else
{
ps = ptr;
}
free(ps); //釋放內(nèi)存并置為空指針
ps = NULL;
}2.不用柔性數(shù)組的話有什么代替
我們經(jīng)常用字符串指針來申請空間,
那我們直接給字符串指針malloc一塊空間,不就行了嗎,
為什么還要用柔性數(shù)組呢?
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
struct S
{
int x;
int *a;
};
int main()
{
struct S* ps = (struct S*)malloc(sizeof(struct S) );//為結(jié)構(gòu)體變量x開辟空間
if (ps == NULL)
{
return 1;
}
ps->a = (int*)malloc(40); //為字符串指針開辟40個字節(jié)的空間
if (ps->a == NULL)
{
free(ps);
ps = NULL;
return 1;
}
free(ps->a);
ps->a = NULL;
free(ps);
ps = NULL;
}上述代碼確實(shí)可以完成相同的功能,
但是柔性數(shù)組相對而言更好。
讓我們來看看柔性數(shù)組的優(yōu)勢。
三.柔性數(shù)組的優(yōu)勢
1.方便內(nèi)存釋放
- 使用柔性數(shù)組我們只用free一次,
- 而使用字符串指針要free兩次,有內(nèi)存泄漏的風(fēng)險
2.提高訪問速度
- 柔性數(shù)組malloc了一次,是連續(xù)的內(nèi)存,
- 有益于提高訪問速度,減少內(nèi)存碎片。
到此這篇關(guān)于C語言 柔性數(shù)組的使用詳解的文章就介紹到這了,更多相關(guān)C語言 柔性數(shù)組內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語言rewind與fseek函數(shù)之隨機(jī)讀寫文件的用法詳解
這篇文章主要介紹了C語言rewind與fseek函數(shù)之隨機(jī)讀寫文件的用法詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-09-09
C++中fstream,ifstream及ofstream用法淺析
這篇文章主要介紹了C++中fstream,ifstream及ofstream用法,適合C++初學(xué)者學(xué)習(xí)文件流的操作,需要的朋友可以參考下2014-08-08
C/C++實(shí)現(xiàn)通訊錄管理系統(tǒng)(附源碼)
這篇文章主要為大家詳細(xì)介紹了如何利用C++實(shí)現(xiàn)通訊錄管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-12-12
C語言編程之動態(tài)內(nèi)存與柔性數(shù)組的了解
本文是C語言編程篇,這篇文章主要為大家介紹了C語言編程中動態(tài)內(nèi)存的函數(shù)與柔性數(shù)組的特點(diǎn),有需要的朋友可以借鑒參考下,希望可以有所幫助2021-09-09
關(guān)于C++中0是十進(jìn)制還是八進(jìn)制的問題
本篇文章中,小編將為大家介紹關(guān)于C++中0是十進(jìn)制還是八進(jìn)制的問題,有需要的朋友可以參考一下2013-04-04
C語言使用setjmp和longjmp實(shí)現(xiàn)一個簡單的協(xié)程
這篇文章主要為大家介紹了C語言使用setjmp和longjmp實(shí)現(xiàn)一個簡單的協(xié)程過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12
C語言實(shí)現(xiàn)打印楊輝三角的方法詳細(xì)(三種方法)
楊輝三角是中國古代數(shù)學(xué)的杰出研究成果之一,它把二項式系數(shù)圖形化,把組合數(shù)內(nèi)在的一些代數(shù)性質(zhì)直觀地從圖形中體現(xiàn)出來,是一種離散型的數(shù)與形的結(jié)合。本文將介紹三種可以實(shí)現(xiàn)打印楊輝三角的辦法,感興趣的可以試一試2022-01-01

