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

學無先后,達者為師

網站首頁 編程語言 正文

一文帶你搞懂C語言動態內存管理_C 語言

作者:Fug_Lee ? 更新時間: 2022-12-07 編程語言

一、malloc函數和free函數

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

如果開辟成功,則返回一個指向開辟好空間的指針。

如果開辟失敗,則返回一個NULL指針,因此malloc的返回值一定要做檢查。

返回值的類型是 void* ,所以malloc函數并不知道開辟空間的類型,具體在使用的時候使用者自己來決定。

如果參數 size為0,malloc的行為是標準是未定義的,取決于編譯器。

void* malloc (size_t size);

(2) free函數

free函數用來釋放動態開辟的內存。

如果參數 ptr 指向的空間不是動態開辟的,那free函數的行為是未定義的。

如果參數 ptr是NULL指針,則函數什么事都不做。

二、calloc函數與malloc函數的異同

(1)函數的功能是為 num 個大小為 size 的元素開辟一塊空間,并且把空間的每個字節初始化為0。

(2)與函數 malloc 的區別只在于 calloc 會在返回地址之前把申請的空間的每個字節初始化為全0。

(3)例如

#include<stdio.h>
int main()
{
	int* p = calloc(10, sizeof(int));
	if (NULL != p)
	{
	   //使用空間
	}

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

三、柔性數組

(1)特點

  • 結構中的柔性數組成員前面必須至少一個其他成員。2. sizeof 返回的這種結構大小不包括柔性數組的內存。
  • 包含柔性數組成員的結構用malloc ()函數進行內存的動態分配,并且分配的內存應該大于結構的大小,以適應 柔性數組的預期大小。

(2)使用優勢

//代碼1
#include<stdio.h>
typedef struct st_type
{
	int i;
	int a[0];//柔性數組成員
}type_a;
void main()
{
	printf("%d\n", sizeof(type_a));//輸出的是4
	int i = 0;
	type_a* p = (type_a*)malloc(sizeof(type_a) + 100 * sizeof(int));
	//業務處理
	p->i = 100;
	for (i = 0; i < 100; i++)
	{
		p->a[i] = i;
	}
	free(p);
}
//代碼2
#include<stdio.h>
typedef struct st_type
{
	int i;
	int* p_a;
}type_a;
void main()
{
	type_a* p = malloc(sizeof(type_a));
	p->i = 100;
	p->p_a = (int*)malloc(p->i * sizeof(int));
	//業務處理
	for (int i = 0; i < 100; i++)
	{
		p->p_a[i] = i;
	}
	//釋放空間
	free(p->p_a);
	p->p_a = NULL;
	free(p);
	p = NULL;
}

上述代碼1和代碼2都可以完成同樣的功能,但是方法1的實現有兩個好處:

1. 方便內存釋放

如果我們的代碼是在一個給別人用的函數中,你在里面做了二次內存分配,并把整個結構體返回給用戶。用戶調用free可以釋放結構體,但是用戶并不知道這個結構體內的成員也需要free,所以你不能指望用戶來發現這個事。所以,如果我們把結構體的內存以及其成員要的內存一次性分配好了,并返回給用戶一個結構體指針,用戶做一次free就可以把所有的內存也給釋放掉。

2. 這樣有利于訪問速度.

連續的內存有益于提高訪問速度,也有益于減少內存碎片。

原文鏈接:https://blog.csdn.net/Onion_521257/article/details/105622852

欄目分類
最近更新