溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C語言如何實現(xiàn)動態(tài)內存的分配

發(fā)布時間:2022-01-03 12:34:57 來源:億速云 閱讀:238 作者:小新 欄目:開發(fā)技術

這篇文章給大家分享的是有關C語言如何實現(xiàn)動態(tài)內存的分配的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

C 程序中,不同數(shù)據(jù)在內存中分配說明

1)全局變量——內存中的靜態(tài)存儲區(qū)

2)非靜態(tài)的局部變量——內存中的動態(tài)存儲區(qū)——stack 棧

3)臨時使用的數(shù)據(jù)—建立動態(tài)內存分配區(qū)域,需要時隨時開辟,不需要時及時釋放——heap 堆

4)根據(jù)需要向系統(tǒng)申請所需大小的空間,由于未在聲明部分定義其為變量或者數(shù)組,不能通過變量名或者數(shù)組名 來引用這些數(shù)據(jù),只能通過指針來引用)

C語言如何實現(xiàn)動態(tài)內存的分配

內存動態(tài)分配的相關函數(shù)

1)頭文件#include 聲明了四個關于內存動態(tài)分配的函數(shù)

2)函數(shù)原型 void * malloc(usigned int size) //memory allocation

  • 作用——在內存的動態(tài)存儲區(qū)(堆區(qū))中分配一個長度為 size 的連續(xù)空間。

  • 形參 size 的類型為無符號整型,函數(shù)返回值是所分配區(qū)域的第一個字節(jié)的地址,即此函數(shù)是一個指針型函數(shù), 返回的指針指向該分配域的開頭位置。

  • malloc(100); 開辟 100 字節(jié)的臨時空間,返回值為其第一個字節(jié)的地址

3)函數(shù)原型void *calloc(unsigned n,unsigned size)

作用——在內存的動態(tài)存儲區(qū)中分配 n 個長度為 size 的連續(xù)空間,這個空間一般比較大,足以保存一個數(shù)組用 calloc 函數(shù)可以為一維數(shù)組開辟動態(tài)存儲空間,n 為數(shù)組元素個數(shù),每個元素長度為 size.函數(shù)返回指向所分配域的起始位置的指針;分配不成功,返回 NULL。p = calloc(50, 4); //開辟 50*4 個字節(jié)臨時空間,把起始地址分配給指針變量 p

4)函數(shù)原型:void free(void *p)

作用——釋放變量 p 所指向的動態(tài)空間,使這部分空間能重新被其他變量使用。p 是最近一次調用 calloc 或 malloc 函數(shù)時的函數(shù)返回值free 函數(shù)無返回值free (p ); // 釋放 p 所指向的已分配的動態(tài)空間

5) 函數(shù)原型void *realloc(void *p,unsigned int size)

作用——重新分配 malloc 或 calloc 函數(shù)獲得的動態(tài)空間大小,將 p 指向的動態(tài)空間大小改變?yōu)?size,p 的值不 變,分配失敗返回 NULLrealloc(p, 50); // 將 p 所指向的已分配的動態(tài)空間 改為 50 字節(jié)

6)返回類型說明
 

C語言如何實現(xiàn)動態(tài)內存的分配

C語言如何實現(xiàn)動態(tài)內存的分配

C語言如何實現(xiàn)動態(tài)內存的分配

應用實例

動態(tài)創(chuàng)建數(shù)組,輸入 5 個學生的成績,另外一個函數(shù)檢測成績低于 60 分的,輸出不合格的成績。

代碼演示

#include <stdlib.h>
#include <stdio.h>
int main() {
	void check(int *);
	int * p,i; // 在堆區(qū)開辟一個 5 * 4 的空間,并將地址 (void *) , 轉成 (int *) , 賦給 p
	p = (int *)malloc(5*sizeof(int));
	for( i = 0; i < 5; i++) {
		scanf("%d", p + i);
	}
	check(p); //
	free(p); //銷毀 堆區(qū) p 指向的空間 getchar(); getchar();
	return 0;
}
void check(int *p) {
	int i;
	printf("\n不及格的成績 有: ");
	for(i =0; i < 5; i++) {
		if(p[i] < 60) {
			printf(" %d ", p[i]);
		}
	}
}

動態(tài)分配內存的基本原則

1)避免分配大量的小內存塊。分配堆上的內存有一些系統(tǒng)開銷,所以分配許多小的內存塊比分配幾個大內存塊的 系統(tǒng)開銷大

2)僅在需要時分配內存。只要使用完堆上的內存塊,就需要及時釋放它(如果使用動態(tài)分配內存,需要遵守原則: 誰分配,誰釋放), 否則可能出現(xiàn)內存泄漏

3)總是確保釋放以分配的內存。在編寫分配內存的代碼時,就要確定在代碼的什么地方釋放內存

4)在釋放內存之前,確保不會無意中覆蓋堆上已分配的內存地址,否則程序就會出現(xiàn)內存泄漏。在循環(huán)中分配內 存時,要特別小心

5)指針使用一覽

C語言如何實現(xiàn)動態(tài)內存的分配

感謝各位的閱讀!關于“C語言如何實現(xiàn)動態(tài)內存的分配”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經查實,將立刻刪除涉嫌侵權內容。

AI