【C語言】柔性的數(shù)組是什么?C/C++程序的內(nèi)存開辟又是?-創(chuàng)新互聯(lián)

本文主要講解柔性數(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++程序的內(nèi)存開辟

我們一定想知道,到底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í)際上普通的局部變量是在棧區(qū)分配空間的,棧區(qū)的特點(diǎn)是在上面創(chuàng)建的變量出了作用域就銷毀。
但是被static修飾的變量存放在數(shù)據(jù)段(靜態(tài)區(qū)),數(shù)據(jù)段的特點(diǎn)是在上面創(chuàng)建的變量,直到程序結(jié)束才銷毀
所以生命周期變長(zhǎng)。

二、柔性數(shù)組

柔性數(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ù)的


總結(jié)

這里我們就知道了,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)

成都app開發(fā)公司