新手搭建論壇己做網(wǎng)站網(wǎng)絡(luò)銷售怎么做才能做好
一、介紹
柔性數(shù)組(Flexible Array),又稱可變長數(shù)組。一般數(shù)組的長度是在編譯時確定,而柔性數(shù)組對象的長度在運行時確定。在定義結(jié)構(gòu)體時允許創(chuàng)建一個空數(shù)組(例如:arr [ 0 ]? ),該數(shù)組的大小可在程序運行過程中按照你的需求變動。
struct S
{int n;int arr[0]; // 柔性數(shù)組成員
};// 有些編譯器會報錯無法編譯可以改成:struct S
{int n;int arr[]; // 柔性數(shù)組成員
};
柔性數(shù)組(Flexible Array),是在C語言的 C99 標(biāo)準(zhǔn)中,引入的新特性。結(jié)構(gòu)中的最后一個元素的大小允許是未知的數(shù)組,即為柔性數(shù)組。
二、柔性數(shù)組的特點
- 結(jié)構(gòu)中的柔性數(shù)組成員前面必須至少一個其他成員。
- sizeof 返回的這種結(jié)構(gòu)大小不包括柔性數(shù)組的內(nèi)存。
- 包含柔性數(shù)組成員的結(jié)構(gòu)用?malloc ()?函數(shù)進行內(nèi)存的動態(tài)分配,并且分配的內(nèi)存應(yīng)該大于結(jié)構(gòu)的大小,以適應(yīng)柔性數(shù)組的預(yù)期大小。
#include <stdio.h>struct S
{int n; //4int arr[0]; //大小是未知的
}s;int main(){printf("%d\n", sizeof(s)); //4struct S* ps = (struct S*)malloc(sizeof(struct S) + sizeof(int)); // 后面+的大小就是給柔性數(shù)組準(zhǔn)備的return 0;
}
因為這段空間是 malloc 出來的,所以后面 arr 的空間如果不夠可以進行調(diào)整。它的大小是可以改變的,這里就體現(xiàn)出了 “柔性” 的意義。
三、柔性數(shù)組的使用
// 代碼一
#include <stdio.h>
#include <stdlib.h>struct S
{int n;int arr[0];
};int main()
{struct S* ps = (struct S*)malloc(sizeof(struct S) + sizeof(int));ps->n = 10;for (int i = 0; i < 10; i++){ps->arr[i] = i;}struct S* ptr = (struct S*)realloc(ps, sizeof(struct S) + 20*sizeof(int));if (ptr != NULL){ps = ptr;}free(ps);ps = NULL;return 0;
}
這樣柔性數(shù)組成員? arr ,相當(dāng)于獲得了? 10? 個整型元素的連續(xù)空間。
四、柔性數(shù)組的優(yōu)勢
// 代碼二
#include <stdio.h>
#include <stdlib.h>struct S
{int n;int* arr;
};int main()
{struct S* ps = (struct S*)malloc(sizeof(struct S));if (ps == NULL){return 1;}ps->n = 10;ps->arr = (int*)malloc(10 * sizeof(int));if (ps->arr == NULL){return 1;}for (int i = 0; i < 10; i++){ps->arr[i];}int* ptr = (struct S*)realloc(ps->arr, 20 * sizeof(int));if (ptr != NULL){ps->arr = ptr;}// 這里需要回收2個空間,且回收必須有先后free(ps->arr); // 先free第二塊空間ps->arr = NULL;free(ps);ps = NULL;return 0;
}
上述 代碼一 和 代碼二 可以完成同樣的功能,但是代碼一 的實現(xiàn)有兩個好處:
- 第一個好處是:方便內(nèi)存釋放。
雖然 代碼二實現(xiàn)了相應(yīng)的功能,但是和 代碼一相比還是有很多不足之處的。 代碼二使用指針完成, 進行了兩次 malloc ,而兩次 malloc 對應(yīng)了兩次 free ,相比于 代碼一更容易出錯。如果我們的代碼是在一個給別人用的函數(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)存都給釋放掉,可以間接地減少內(nèi)存泄露的可能性。
- 第二個好處是:這樣有利于訪問速度。
????????連續(xù)內(nèi)存多多少少有益于提高訪問速度,還能減少內(nèi)存碎片。malloc 的次數(shù)越多,產(chǎn)生的內(nèi)存碎片就越多,這些內(nèi)存碎片不大不小,再次被利用的可能性很低。內(nèi)存碎片越多,內(nèi)存的利用率就會降低。頻繁的開辟空間效率會變低,碎片也會增加。