本文主要講解柔性數(shù)組的相關(guān)知識(shí)點(diǎn),并穿插一下C/C++程序的內(nèi)存開辟,涉及到動(dòng)態(tài)內(nèi)存管理函數(shù),如有不了解的,請(qǐng)參考這一篇文章【C語言】小王帶您輕松實(shí)現(xiàn)動(dòng)態(tài)內(nèi)存管理(簡(jiǎn)單易懂)_小王學(xué)代碼的博客-博客
創(chuàng)新互聯(lián)主營(yíng)環(huán)江網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,成都app軟件開發(fā),環(huán)江h(huán)5重慶小程序開發(fā)搭建,環(huán)江網(wǎng)站營(yíng)銷推廣歡迎環(huán)江等地區(qū)企業(yè)咨詢
目錄
前言
一、C/C++程序的內(nèi)存開辟
1.1 初步分析內(nèi)存
1.2 詳細(xì)分析內(nèi)存管理
二、柔性數(shù)組
2.1 柔性數(shù)組的特點(diǎn)
2.2 柔性數(shù)組的使用
2.3 柔性數(shù)組的優(yōu)勢(shì)
總結(jié)
首先,我們知道在程序編譯、運(yùn)行的過程中,程序中的變量等會(huì)再內(nèi)存中申請(qǐng)空間,這個(gè)時(shí)候呢,就需要我們來了解一下,C/C++程序的內(nèi)存開辟是什么情況。
其次,我們都知道數(shù)組,知道數(shù)組是在編譯的時(shí)候,就已經(jīng)固定了內(nèi)存空間,元素大小,那么什么又叫做柔性數(shù)組呢,是不是我們所想的那樣,可以任意變化數(shù)組大小呢?
接下來,讓小王帶領(lǐng)大家一一探討!?。?/p>
我們一定想知道,到底C/C++程序在運(yùn)行過程會(huì)將內(nèi)存分為幾部分,是如何劃分的?
首先有一個(gè)簡(jiǎn)易圖,讓我們大致了解一下,變量放在哪,動(dòng)態(tài)管理函數(shù)又放在哪?
內(nèi)存空間可以初步分為:棧區(qū)、堆區(qū)、靜態(tài)區(qū)
如圖所示:
1.1 初步分析內(nèi)存棧區(qū):主要是局部變量和函數(shù)形參在這個(gè)地方占用空間
堆區(qū):動(dòng)態(tài)內(nèi)存管理函數(shù)malloc、free、calloc、realloc等等函數(shù)申請(qǐng)空間
靜態(tài)區(qū):存放全局變量、靜態(tài)變量?
有關(guān)于堆區(qū)的這些函數(shù)可以去上一篇函數(shù)去看看,靜態(tài)區(qū)也沒什么好講的,主要是全局變量和靜態(tài)變量。
全局變量:在整個(gè)程序中所有函數(shù)之內(nèi)都可以使用,可以更改內(nèi)容,只在程序結(jié)束時(shí)退出
靜態(tài)變量:由static修飾的變量,可以更改內(nèi)容,在程序結(jié)束的時(shí)候才會(huì)失去對(duì)空間的使用權(quán)
棧區(qū),由一個(gè)常見的小問題,返回棧區(qū)空間問題
如圖所示:
1.2 詳細(xì)分析內(nèi)存管理我們將內(nèi)存更加細(xì)致的分為,內(nèi)核空間、棧、內(nèi)存映射段、堆、數(shù)據(jù)段、代碼段
如圖所示:
C/C++程序內(nèi)存分配的幾個(gè)區(qū)域:
1. 棧區(qū)(stack):在執(zhí)行函數(shù)時(shí),函數(shù)內(nèi)局部變量的存儲(chǔ)單元都可以在棧上創(chuàng)建,函數(shù)執(zhí)行結(jié)束時(shí)這些存儲(chǔ)單元自動(dòng)被釋放。棧內(nèi)存分配運(yùn)算內(nèi)置于處理器的指令集中,效率很高,但是分配的內(nèi)存容量有限。 棧區(qū)主要存放運(yùn)行函數(shù)而分配的局部變量、函數(shù)參數(shù)、返回?cái)?shù)據(jù)、返回地址等。
2. 堆區(qū)(heap):一般由程序員分配釋放, 若程序員不釋放,程序結(jié)束時(shí)可能由OS回收 。分配方式類似于鏈表。
3. 數(shù)據(jù)段(靜態(tài)區(qū))(static)存放全局變量、靜態(tài)數(shù)據(jù)。程序結(jié)束后由系統(tǒng)釋放。
4. 代碼段:存放函數(shù)體(類成員函數(shù)和全局函數(shù))的二進(jìn)制代碼
有了上圖,我們就可以更加清晰的認(rèn)知到,由static來靜態(tài)修飾局部變量的意義了,相當(dāng)于改變了生命周期。
二、柔性數(shù)組實(shí)際上普通的局部變量是在棧區(qū)分配空間的,棧區(qū)的特點(diǎn)是在上面創(chuàng)建的變量出了作用域就銷毀。
但是被static修飾的變量存放在數(shù)據(jù)段(靜態(tài)區(qū)),數(shù)據(jù)段的特點(diǎn)是在上面創(chuàng)建的變量,直到程序結(jié)束才銷毀
所以生命周期變長(zhǎng)。
柔性數(shù)組,是C99標(biāo)準(zhǔn)中,結(jié)構(gòu)中的最后一個(gè)元素允許是未知大小的數(shù)組,這就是柔性數(shù)組成員
例如:
typedef struct Node {
int i;
int arr[];//這就是柔性數(shù)組成員
//或者是這樣的情況:int arr[0]
//int arr[0] 中的零并沒有實(shí)際意義,并不是說明0個(gè)元素,這只是柔性數(shù)組的標(biāo)識(shí)
};
2.1 柔性數(shù)組的特點(diǎn)1.結(jié)構(gòu)中的柔性數(shù)組成員前面必須至少一個(gè)其他成員。? ? ? ??
2.sizeof 返回的這種結(jié)構(gòu)大小不包括柔性數(shù)組的內(nèi)存。
3.包含柔性數(shù)組成員的結(jié)構(gòu)用malloc ()函數(shù)進(jìn)行內(nèi)存的動(dòng)態(tài)分配,并且分配的內(nèi)存應(yīng)該大于? 結(jié)構(gòu)的大小,以適應(yīng)柔性數(shù)組的預(yù)期大小
圖示解釋:
2.2 柔性數(shù)組的使用實(shí)際上柔性數(shù)組的使用和其他數(shù)組的使用是沒有什么區(qū)別的,只是說,柔性數(shù)組是一種方式,可以在不知道需要多大的數(shù)組元素個(gè)數(shù)的時(shí)候,使用, 這樣在后面可以根據(jù)自己所需,申請(qǐng)適當(dāng)空間大小的數(shù)組來使用。所以是柔性的,普通數(shù)組是固定死的
代碼演示:
typedef struct Node {
int i;
int arr[];//這就是柔性數(shù)組成員
//或者是這樣的情況:int arr[0]
//int arr[0] 中的零并沒有實(shí)際意義,并不是說明0個(gè)元素,這只是柔性數(shù)組的標(biāo)識(shí)
}Node;
int main()
{
int sz = sizeof(Node);
printf("%d\n", sz);//4 只算除了柔性數(shù)組的其他成員的內(nèi)容
Node* p = (Node*)malloc(sizeof(Node)+10*sizeof(int));
//創(chuàng)建 p結(jié)構(gòu)體的空間,sizeof(Node)為int i 的空間 10*sizeof(int) 是留給柔性數(shù)組的空間
for (int i = 0; i< 10; i++) {
p->arr[i] = i + 1;
}
for (int i = 0; i< 10; i++) {
printf("%d ", p->arr[i]);
}
free(p);
return 0;
}
根據(jù)自己所需,我們?cè)O(shè)計(jì)了10個(gè)int類型元素的數(shù)組arr
2.3 柔性數(shù)組的優(yōu)勢(shì)我們現(xiàn)在可能反應(yīng)回來了,可能有人在問,這個(gè)柔性數(shù)組,我們也可以這樣搞呀!
代碼演示:
struct S {
int n;
int* arr;
};
int main()
{
//先申請(qǐng)結(jié)構(gòu)體的空間
struct S* s = (struct S*)malloc(sizeof(struct S));
//賦值
s->n = 10;
//再申請(qǐng)int*的空間
s->arr = (int*)malloc(sizeof(int) * 10);
//這樣申請(qǐng)到了10個(gè)整型大小的空間
for (int i = -0; i< 10; i++) {
s->arr[i] = i + 1;
}
for (int i = 0; i< 10; i++) {
printf("%d ", s->arr[i]);
}
free(s->arr);//先取消s.arr的空間并置為NULL,如果先s置為NULL,再滯空arr 的時(shí)候會(huì)警告
s->arr = NULL;
free(s);//要注意先后順序,先內(nèi)部的arr free滯空,再s free滯空
s = NULL;
return 0;//防止錯(cuò)誤吧,邏輯問題
}
我們能看到,這樣的代碼也能實(shí)現(xiàn)柔性數(shù)組那樣的功能啊,確實(shí)是可以實(shí)現(xiàn)的,但是我們來分析一下,使用柔性數(shù)組有什么優(yōu)勢(shì)呢?
第一:方便內(nèi)存釋放
如果我們的代碼是在一個(gè)給別人用的函數(shù)中,你在里面做了二次內(nèi)存分配,并把整個(gè)結(jié)構(gòu)體返回給用戶。用戶調(diào)用free可以釋放結(jié)構(gòu)體,但是用戶并不知道這個(gè)結(jié)構(gòu)體內(nèi)的成員也需要free,所以你不能指望用戶來發(fā)現(xiàn)這個(gè)事。所以,如果我們把結(jié)構(gòu)體的內(nèi)存以及其成員要的內(nèi)存一次性分配好了,并返回給用戶一個(gè)結(jié)構(gòu)體指針,用戶做一次free就可以把所有的內(nèi)存也給釋放掉。
第二:這樣有益于訪問速度
連續(xù)的內(nèi)存有益于提高訪問速度,也有益于減少內(nèi)存碎片。(其實(shí),我個(gè)人覺得也沒多高了,反正你跑不了要用做偏移量的加法來尋址)
就是說使用柔性數(shù)組,只需要malloc一次、free一次、且空間是連續(xù)的
非柔性數(shù)組,需要malloc兩次、free一次、且空間不是連續(xù)的
這里我們就知道了,C/C++程序的內(nèi)存分配是什么情況,簡(jiǎn)易的內(nèi)存分配可以怎么描述?更加細(xì)致的分配,我也在本文中講解了,最后是對(duì)于柔性數(shù)組的分析和使用,可能有些小伙伴覺得,哎,好像這個(gè)柔性數(shù)組沒有什么太大的用處啊,我可以用別的方法實(shí)現(xiàn)呀(有講),實(shí)際上這是C語言給我們提供的一種解決問題的思路或者是方式,不需要深究,我們知道,會(huì)用即可?。?!
那么本文就到此結(jié)束了,下一篇文章,我們來講述一下,文件操作是如何使用的,相關(guān)函數(shù)又是如何,可以對(duì)通訊錄做升級(jí)處理啦!??!
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧
新聞標(biāo)題:【C語言】柔性的數(shù)組是什么?C/C++程序的內(nèi)存開辟又是?-創(chuàng)新互聯(lián)
標(biāo)題來源:http://muchs.cn/article8/phsip.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站、網(wǎng)站內(nèi)鏈、移動(dòng)網(wǎng)站建設(shè)、微信公眾號(hào)、品牌網(wǎng)站建設(shè)、面包屑導(dǎo)航
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容
移動(dòng)網(wǎng)站建設(shè)知識(shí)