日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無先后,達者為師

網(wǎng)站首頁 編程語言 正文

c語言學(xué)習(xí)——動態(tài)內(nèi)存分配

作者:@川川而山 更新時間: 2022-08-30 編程語言

文章目錄

    • 前言
    • 1.malloc和free
    • 2.calloc
    • 3.realloc

前言

一些內(nèi)存的使用方式
1.創(chuàng)建一個變量
int a=1;//局部變量----棧區(qū)
int g_a=10;//全局變量----靜態(tài)區(qū)

在這里插入圖片描述

1.malloc和free

void *(size_t size)
這個函數(shù)向內(nèi)存申請一塊連續(xù)可用的空間,并返回指向這塊空間的指針。

如果開辟成功,則返回一個人指向開辟好空間的地址。
如果開辟失敗,則返回一個NULL指針,因此malloc的返回值一定要做檢查。
返回值類型時void*,所以malloc函數(shù)并不知道開辟空間的類型,具體在使用的時候使用者自己決定。
如果參數(shù)size為0,malloc的行為是標準是未定義的,取決于編譯器。

int main() {

// 開辟10個整型的空間
	int* p =(int*) malloc(10 * sizeof(int));
	if (p == NULL) {
		printf("%s\n", strerror(errno));
	}
	else {
		int i = 0;
		for (i = 0; i < 10; i++) {
			*(p + i) = i;
		}
		for (i = 0; i < 10; i++) {
			printf("%d ", *(p + i));
		}
	}

	//當動態(tài)內(nèi)存不再使用的時候,
	//應(yīng)該還給操作系統(tǒng)
	free(p);
	p = NULL;
	return 0;
}

2.calloc

void* calloc(size_t num,size_t size)

函數(shù)功能是為num個大小為size的元素開辟一塊空間,并且把空間的每個字節(jié)初始化為0。
與malloc的區(qū)別只在于calloc會在返回地址之前把申請的空間的每個字節(jié)初始化為全0.

int main() {
	int*p =(int*)calloc(10, sizeof(int));
	if (p == NULL) {
		printf("%s\n", strerror(errno));
	}
	else {
		int i = 0;
		for (i = 0; i < 10; i++) {
			printf("%d ", *(p + i));
		}
	}

	free(p);
	p = NULL;
	return 0;
}

3.realloc

調(diào)整動態(tài)開辟內(nèi)存空間的大小。
void* realloc(void* ptr ,size_t size);

ptr 是要調(diào)整的內(nèi)存地址
size 調(diào)整之后新大小
返回值為調(diào)整之后的內(nèi)存起始地址
函數(shù)調(diào)整原內(nèi)存空間大小的基礎(chǔ)上,還會將原來內(nèi)存中的數(shù)據(jù)移動到新的空間。


int main() {
	int* p = (int*)malloc(20);
	if (p == NULL) {
		printf("%s\n", strerror(errno));
	}
	else {
		int i = 0;
		for (i = 0; i < 5; i++) {
			*(p + i) = i;
		}
	}


	int* ptr = (int*)realloc(p, 40);
	if (ptr != NULL) {
		p = ptr;
		int i = 0;
		for (i = 5; i < 10; i++) {
			*(p + i) = i;
		}

		for (i = 0; i < 10; i++) {
			printf("%d ", *(p + i));
		}
	}
	else {
		printf("%s\n", strerror(errno));
	}

	free(p);
	p = NULL;
	return 0;
}

realoc使用注意:

1.如果p指向的空間之后有足夠的空間可以追加,則直接返回,返回p。
2.如果p指向的空間之后沒有足夠的內(nèi)存空間可以追加,則realloc函數(shù)會重新找一個新的內(nèi)存區(qū)域,開辟一塊滿足的空間,并把原來內(nèi)存中的數(shù)據(jù)拷貝回來,釋放舊的內(nèi)存空間。
3.得用一個新的變量來接收realloc函數(shù)的返回值。

原文鏈接:https://blog.csdn.net/weixin_47306453/article/details/126550174

欄目分類
最近更新