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

學無先后,達者為師

網站首頁 編程語言 正文

c語言學習——動態內存分配

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

文章目錄

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

前言

一些內存的使用方式
1.創建一個變量
int a=1;//局部變量----棧區
int g_a=10;//全局變量----靜態區

在這里插入圖片描述

1.malloc和free

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

如果開辟成功,則返回一個人指向開辟好空間的地址。
如果開辟失敗,則返回一個NULL指針,因此malloc的返回值一定要做檢查。
返回值類型時void*,所以malloc函數并不知道開辟空間的類型,具體在使用的時候使用者自己決定。
如果參數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));
		}
	}

	//當動態內存不再使用的時候,
	//應該還給操作系統
	free(p);
	p = NULL;
	return 0;
}

2.calloc

void* calloc(size_t num,size_t size)

函數功能是為num個大小為size的元素開辟一塊空間,并且把空間的每個字節初始化為0。
與malloc的區別只在于calloc會在返回地址之前把申請的空間的每個字節初始化為全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

調整動態開辟內存空間的大小。
void* realloc(void* ptr ,size_t size);

ptr 是要調整的內存地址
size 調整之后新大小
返回值為調整之后的內存起始地址
函數調整原內存空間大小的基礎上,還會將原來內存中的數據移動到新的空間。


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指向的空間之后沒有足夠的內存空間可以追加,則realloc函數會重新找一個新的內存區域,開辟一塊滿足的空間,并把原來內存中的數據拷貝回來,釋放舊的內存空間。
3.得用一個新的變量來接收realloc函數的返回值。

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

欄目分類
最近更新