国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

動(dòng)態(tài)內(nèi)存管理函數(shù)介紹及C語言實(shí)現(xiàn)通訊錄管理系統(tǒng)2.0版(動(dòng)態(tài)增長版本)

這篇具有很好參考價(jià)值的文章主要介紹了動(dòng)態(tài)內(nèi)存管理函數(shù)介紹及C語言實(shí)現(xiàn)通訊錄管理系統(tǒng)2.0版(動(dòng)態(tài)增長版本)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

1. 前言

之前向大家介紹了C語言實(shí)現(xiàn)通訊錄管理系統(tǒng)1.0版本,但該版本有明顯的不足之處,比如:一開始就開辟了1000個(gè)date數(shù)組,如果聯(lián)系人很少,那么就會(huì)造成嚴(yán)重的內(nèi)存浪費(fèi),或者聯(lián)系人超過了1000人,那么原數(shù)組就放不下了,所以今天我們考慮使用動(dòng)態(tài)內(nèi)存管理的辦法來實(shí)現(xiàn)一個(gè)內(nèi)存會(huì)隨著聯(lián)系人的增加而增加的通訊錄動(dòng)態(tài)增長版!
首先我們先來學(xué)習(xí)如何進(jìn)行動(dòng)態(tài)內(nèi)存分配及動(dòng)態(tài)內(nèi)存函數(shù)的使用方法。

2. 動(dòng)態(tài)內(nèi)存函數(shù)

2.1 malloc函數(shù)

定義:void* malloc(size_t size);
功能:向內(nèi)存申請(qǐng)一塊連續(xù)可用的空間,并返回指向這塊空間的指針。
注意事項(xiàng):
size的單位是字節(jié)
如果開辟成功,則返回一個(gè)指向開辟好空間的指針。
如果開辟失敗,則返回一個(gè)NULL指針,因此malloc的返回值一定要做檢查。
返回值的類型是void* ,所以malloc函數(shù)并不知道開辟空間的類型,具體在使用的時(shí)候使用者自己來決定,使用前強(qiáng)制類型轉(zhuǎn)換。
如果參數(shù)size為0,malloc的行為是標(biāo)準(zhǔn)是未定義的,取決于編譯器。

使用方法:

int main()
{
	//申請(qǐng)空間
	int* ptr = (int*)malloc(40);
	int* p = ptr;
	if (p == NULL)
	{
		perror("malloc");
		return 1;
	}
	int i = 0;
	for (i = 0; i < 10; i++)
	{

		*p = i;
		p++;
	}
	//釋放空間
	free(ptr);
	ptr = NULL;
	return 0;
}

2.2 free函數(shù)

定義:void free(void* str);
功能:free函數(shù)用來釋放動(dòng)態(tài)開辟的內(nèi)存。
注意事項(xiàng):
如果參數(shù)ptr指向的空間不是動(dòng)態(tài)開辟的,那free函數(shù)的行為是未定義的。
如果參數(shù)ptr是NULL指針,則函數(shù)什么事都不做。
當(dāng)我們不釋放動(dòng)態(tài)申請(qǐng)的內(nèi)存的時(shí)候:
如果程序結(jié)束,動(dòng)態(tài)申請(qǐng)的內(nèi)存由操作系統(tǒng)自動(dòng)回收。
但是如果程序不結(jié)束,動(dòng)態(tài)內(nèi)存是不會(huì)自動(dòng)回收的,就會(huì)形成內(nèi)存泄露的問題。
所以只要?jiǎng)討B(tài)開辟了內(nèi)存,使用完就需要用free函數(shù)釋放。

2.3 calloc函數(shù)

定義:void* calloc(size_t num, size_t size);
功能:為num個(gè)大小為size的元素開辟一塊空間,并且把空間的每個(gè)字節(jié)初始化為0。
注意事項(xiàng):
與函數(shù)malloc的區(qū)別只在于calloc會(huì)在返回地址之前把申請(qǐng)的空間的每個(gè)字節(jié)初始化為全0。

使用方法:

int main()
{
	//申請(qǐng)空間
	int* ptr = (int*)calloc(10, sizeof(int));
	int* p = ptr;
	if (p == NULL)
	{
		perror("calloc");
	}
	//使用空間

	//釋放空間
	free(ptr);
	ptr = NULL;
	return 0;
}

2.4 realloc函數(shù)

定義:void* realloc(void* ptr, size_t size);
功能:realloc函數(shù)可以做到對(duì)動(dòng)態(tài)開辟內(nèi)存大小的調(diào)整。
注意事項(xiàng):
ptr是要調(diào)整的內(nèi)存地址。
size調(diào)整之后新大小。
返回值為調(diào)整之后的內(nèi)存起始位置。
這個(gè)函數(shù)在調(diào)整原內(nèi)存空間大小的基礎(chǔ)上,還會(huì)將原來內(nèi)存中的數(shù)據(jù)移動(dòng)到新的空間。

realloc在調(diào)整內(nèi)存空間的是存在兩種情況:
情況1:原有空間之后有足夠大的空間
擴(kuò)展內(nèi)存就直接原有內(nèi)存之后直接追加空間,原來空間的數(shù)據(jù)不發(fā)生變化。
情況2:原有空間之后沒有足夠大的空間
擴(kuò)展的方法是:在堆空間上另找一個(gè)合適大小的連續(xù)空間來使用。這樣函數(shù)返回的是一個(gè)新的內(nèi)存地址。
此時(shí)就要注意,如果整個(gè)堆區(qū)都沒有一個(gè)合適大小的連續(xù)空間,就會(huì)申請(qǐng)失敗。
所以使用完realloc函數(shù)應(yīng)該先判斷返回的地址是否為空,不為空就可以正常使用了。

使用方法:

int main()
{
	//申請(qǐng)空間
	int* ptr = (int*)malloc(40);
	if (ptr == NULL)
	{
		perror("malloc");
		return 1;
	}
	//使用空間
	int* p = ptr;
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		*p = i;
		p++;
	}
	//擴(kuò)容空間
	int* p2 = (int*)realloc(ptr, 80);
	if (p2 == NULL)
	{
		perror("realloc");
	}
	p = p2;
	//使用空間

	//釋放空間
	free(p);
	p = NULL;
	return 0;
}

3. 優(yōu)化通訊錄程序

學(xué)習(xí)完這些動(dòng)態(tài)內(nèi)存函數(shù)以后,我們就可以用動(dòng)態(tài)內(nèi)存分配來優(yōu)化通訊錄代碼,避免內(nèi)存浪費(fèi)和內(nèi)存不足的問題。

3.1 通訊錄的優(yōu)化

我們原來創(chuàng)建的通訊錄是直接創(chuàng)建了1000個(gè)元素,而動(dòng)態(tài)內(nèi)存版本我們首先應(yīng)該考慮如何修改通訊錄,來滿足我們的需求,這里我有兩個(gè)想法:
1.通訊錄初始只能存放3個(gè)聯(lián)系人的信息。
2.當(dāng)通訊錄滿的時(shí)候,每次增加2個(gè)人的空間。
這樣修改的話,既避免了內(nèi)存的浪費(fèi),也不會(huì)出現(xiàn)內(nèi)存不夠的情況。
具體修改方式如下:

//靜態(tài)版本
//typedef struct contact
//{
//	people date[MAX];//1000人的信息
//	int count;//已保存的信息個(gè)數(shù)
//}contact;

//動(dòng)態(tài)版本
typedef struct contact
{
	people* date;//1000人的信息
	int count;//已保存的信息個(gè)數(shù)
	int cap;//記錄當(dāng)前通訊錄的最大容量
}contact;

3.2 初始化通訊錄的優(yōu)化

接下來就該初始化了,初始化通訊錄的時(shí)候用malloc函數(shù)來開辟內(nèi)存。

//靜態(tài)版本
//void InitContact(contact* pc)
//{
//	assert(pc);
//	pc->count = 0;
//	memset(pc->date, 0, sizeof(pc->date));
//}

//動(dòng)態(tài)版本
void InitContact(contact* pc)
{
	assert(pc);
	pc->count = 0;
	pc->cap = DEFAULT_SIZE;
	pc->date = (people*)malloc((pc->cap) * (sizeof(people)));
	if (pc->date == NULL)
	{
		perror("InitContact::malloc");
		return;
	}
	memset(pc->date, 0, (pc->cap) * (sizeof(people)));
}

當(dāng)退出通訊錄的時(shí)候,我們要釋放動(dòng)態(tài)開辟的內(nèi)存,所以還應(yīng)該添加一個(gè)銷毀通訊錄的函數(shù)。

void DestroyContact(contact* pc)
{
	free(pc->date);
	pc->date = NULL;
	pc->cap = 0;
	pc->count = 0;
	printf("銷毀成功\n");
}

3.3 添加聯(lián)系人的優(yōu)化

接下來就是添加聯(lián)系人的時(shí)候加入判斷函數(shù),判斷此時(shí)通訊錄是否為滿,如果滿了就再開辟2個(gè)聯(lián)系人的內(nèi)存,每次添加都應(yīng)該判斷一次。

void CheckCapacity(contact* pc)
{
	if (pc->count == pc->cap)
	{
		people* ptest = (people*)realloc(pc->date, ((pc->cap) + 2) * (sizeof(people)));
		if (ptest != NULL)
		{
			pc->date = ptest;
		}
		else
		{
			perror("CheckCapacity::realloc");
			return;
		}
		pc->cap += 2;
		printf("擴(kuò)容成功\n");
	}
}

void AddPeople(contact* pc)
{
	assert(pc);
	//靜態(tài)版本
	//if (pc->count == MAX)
	//{
	//	printf("通訊錄已滿,無法添加\n");
	//	return;
	//}

	//動(dòng)態(tài)版本
	CheckCapacity(pc);

	printf("請(qǐng)輸入姓名:\n");
	scanf("%s", pc->date[pc->count].name);
	printf("請(qǐng)輸入性別:\n");
	scanf("%s", pc->date[pc->count].sex);
	printf("請(qǐng)輸入年齡:\n");
	scanf("%d", &pc->date[pc->count].age);
	printf("請(qǐng)輸入號(hào)碼:\n");
	scanf("%s", pc->date[pc->count].tele);
	printf("請(qǐng)輸入地址:\n");
	scanf("%s", pc->date[pc->count].address);
	pc->count++;
	printf("添加成功\n");
}

3.4 運(yùn)行測試

我們來運(yùn)行代碼,觀察結(jié)果
動(dòng)態(tài)內(nèi)存管理函數(shù)介紹及C語言實(shí)現(xiàn)通訊錄管理系統(tǒng)2.0版(動(dòng)態(tài)增長版本)
可以看出,這時(shí)候代碼已經(jīng)優(yōu)化完成,初始只能保存3個(gè)聯(lián)系人的信息,當(dāng)繼續(xù)存儲(chǔ)時(shí)就會(huì)擴(kuò)容。如果退出程序,就會(huì)銷毀(釋放)掉動(dòng)態(tài)內(nèi)存分配的空間,不會(huì)造成內(nèi)存泄漏的問題。

4. 結(jié)尾

到這里,我們動(dòng)態(tài)增長版本的通訊錄管理系統(tǒng)2.0也就優(yōu)化完成了,后續(xù)我還會(huì)對(duì)代碼進(jìn)行優(yōu)化,敬請(qǐng)期待。文章來源地址http://www.zghlxwxcb.cn/news/detail-403047.html

到了這里,關(guān)于動(dòng)態(tài)內(nèi)存管理函數(shù)介紹及C語言實(shí)現(xiàn)通訊錄管理系統(tǒng)2.0版(動(dòng)態(tài)增長版本)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【C語言】——?jiǎng)討B(tài)內(nèi)存管理與文件操作,后面加一個(gè)通訊錄福利,萬字解讀,看完你會(huì)有一個(gè)全新認(rèn)識(shí)

    【C語言】——?jiǎng)討B(tài)內(nèi)存管理與文件操作,后面加一個(gè)通訊錄福利,萬字解讀,看完你會(huì)有一個(gè)全新認(rèn)識(shí)

    目錄 一.動(dòng)態(tài)內(nèi)存管理 1.為什么有動(dòng)態(tài)內(nèi)存管理 2.malloc和free ?2.calloc和realloc 3.柔性數(shù)組 二.文件操作 1.為什么使用文件 ?2.二進(jìn)制文件和文本文件 ?3.文件的打開和關(guān)閉 4.文件的順序讀寫 5.文件緩沖區(qū) 三.通訊錄 ?1.預(yù)處理 ?2.基本框架 3.初始化函數(shù) 4.增加聯(lián)系人 ?5.顯示聯(lián)系人

    2024年03月13日
    瀏覽(21)
  • 文件操作介紹及C語言實(shí)現(xiàn)通訊錄管理系統(tǒng)3.0最終版(文件操作版本)

    文件操作介紹及C語言實(shí)現(xiàn)通訊錄管理系統(tǒng)3.0最終版(文件操作版本)

    上一篇文章我們學(xué)習(xí)了動(dòng)態(tài)內(nèi)存開辟的相關(guān)知識(shí)點(diǎn),并用動(dòng)態(tài)內(nèi)存函數(shù)優(yōu)化了我們的通訊錄,但通訊錄還有需要改進(jìn)的地方,比如,正常情況下的通訊錄,應(yīng)該可以一直保存聯(lián)系人信息,而不是退出就清空了,這就需要我們實(shí)實(shí)在在的保存下來一個(gè)通訊錄。 接下來我會(huì)給大家

    2023年04月08日
    瀏覽(21)
  • 動(dòng)態(tài)通訊錄實(shí)現(xiàn)(C語言)

    動(dòng)態(tài)通訊錄實(shí)現(xiàn)(C語言)

    目錄 前言: 一:單個(gè)節(jié)點(diǎn)的設(shè)計(jì)和主邏輯? 結(jié)點(diǎn)設(shè)計(jì) 主邏輯 二:接口實(shí)現(xiàn) (1)生成一個(gè)新的結(jié)點(diǎn) (2)增加信息 (3)打印信息 (4)查找? (5)刪除信息 (6)修改信息 (7)排序 ?插入排序 快速排序 (8)已有數(shù)據(jù)讀取 (9)更新數(shù)據(jù)錄入 三:全部代碼 contact.h(聲明) contact.c(接口) test.c(主邏輯) 本

    2024年02月05日
    瀏覽(95)
  • 【C語言】實(shí)現(xiàn)動(dòng)態(tài)版通訊錄

    【C語言】實(shí)現(xiàn)動(dòng)態(tài)版通訊錄

    ??內(nèi)容專欄:【C語言】進(jìn)階部分 ??本文概括: 結(jié)合自定義類型、動(dòng)態(tài)內(nèi)存管理知識(shí),對(duì)靜態(tài)版本的通訊錄進(jìn)行優(yōu)化。 ??本文作者:花 碟 ??發(fā)布時(shí)間:2023.4.2 ? 目錄 前言: 一、靜態(tài)版本代碼實(shí)現(xiàn): 二、動(dòng)態(tài)通訊錄? 三、代碼整理? 前面我們學(xué)過了結(jié)構(gòu)體、枚舉等自定義

    2024年02月02日
    瀏覽(95)
  • 【C語言】實(shí)現(xiàn)通訊錄(動(dòng)態(tài)+文件)

    【C語言】實(shí)現(xiàn)通訊錄(動(dòng)態(tài)+文件)

    在之前三子棋和掃雷的基礎(chǔ)上,本篇文章博主將給大家逐步分析實(shí)現(xiàn)通訊錄,介紹通訊錄的每個(gè)功能( 動(dòng)態(tài)增長和文件保存 )。 —————————————————————— test.c - 測試通訊錄 Contact.c - 函數(shù)的實(shí)現(xiàn) Contact.h - 函數(shù)和類型的聲明 以多文件的形式分模塊寫的

    2024年02月13日
    瀏覽(78)
  • C語言實(shí)現(xiàn)通訊錄--動(dòng)態(tài)版

    C語言實(shí)現(xiàn)通訊錄--動(dòng)態(tài)版

    實(shí)現(xiàn)一個(gè)通訊錄,聯(lián)系人的數(shù)量可多可少 1.在靜態(tài)版本的基礎(chǔ)上改用動(dòng)態(tài)的方法: (1)默認(rèn)能夠存放三個(gè)人的信息 (2)不夠的話,每次增加兩個(gè)人的信息 2.其他功能不變 建立三個(gè)文件: test.c 用于測試通訊錄的相關(guān)功能 contsct.c 通訊錄的實(shí)現(xiàn)模塊(用函數(shù)實(shí)現(xiàn)功能) conta

    2024年02月15日
    瀏覽(99)
  • C語言之通訊錄的實(shí)現(xiàn)(靜態(tài)版,動(dòng)態(tài)版,文件版)

    C語言之通訊錄的實(shí)現(xiàn)(靜態(tài)版,動(dòng)態(tài)版,文件版)

    個(gè)人主頁(找往期文章包括但不限于本期文章中不懂的知識(shí)點(diǎn)):?我要學(xué)編程(?_?)-CSDN博客 目錄 靜態(tài)通訊錄的實(shí)現(xiàn)邏輯? test.c:通訊錄的邏輯實(shí)現(xiàn) Contact.h:函數(shù)的聲明與頭文件的包含 Contact.c:函數(shù)的實(shí)現(xiàn)? 通訊錄源碼:? test.c: Contact.c: Contect.h: 動(dòng)態(tài)版通訊錄? test.c: Co

    2024年04月13日
    瀏覽(57)
  • 【C語言】實(shí)現(xiàn)通訊錄管理系統(tǒng)

    【C語言】實(shí)現(xiàn)通訊錄管理系統(tǒng)

    大家好,我是蘇貝,本篇博客帶大家實(shí)現(xiàn)通訊錄,如果你覺得我寫的還不錯(cuò)的話,可以給我一個(gè)贊??嗎,感謝?? 本文將使用C語言來實(shí)現(xiàn)通訊錄管理系統(tǒng),該通訊錄包括若干聯(lián)系人,和每個(gè)聯(lián)系人的姓名、年齡、性別、電話、地址。此通訊錄的功能包括:增加聯(lián)系人信息,

    2024年02月08日
    瀏覽(95)
  • 【進(jìn)階C語言】動(dòng)態(tài)版通訊錄的實(shí)現(xiàn)(詳細(xì)講解+全部碼源)

    【進(jìn)階C語言】動(dòng)態(tài)版通訊錄的實(shí)現(xiàn)(詳細(xì)講解+全部碼源)

    前言 ??作者簡介: 熱愛跑步的恒川 ,致力于 C/C++、Java、Python 等多編程語言,熱愛跑步,喜愛音樂的一位博主。 ??本文收錄于 C語言進(jìn)階 系列,本專欄主要內(nèi)容為數(shù)據(jù)的存儲(chǔ)、指針的進(jìn)階、字符串和內(nèi)存函數(shù)的介紹、自定義類型結(jié)構(gòu)、動(dòng)態(tài)內(nèi)存管理、文件操作等,持續(xù)更

    2024年02月01日
    瀏覽(22)
  • C語言用鏈表實(shí)現(xiàn)通訊錄管理系統(tǒng)

    C語言用鏈表實(shí)現(xiàn)通訊錄管理系統(tǒng)

    目錄 總體思路 具體代碼 編譯通過 總體代碼 一、創(chuàng)建一個(gè)結(jié)構(gòu)體保存通訊錄信息。 二、構(gòu)建鏈表,并存于文件中。 三、實(shí)現(xiàn)鏈表結(jié)點(diǎn)的增加、刪除、查詢、輸出。 一、創(chuàng)建一個(gè)結(jié)構(gòu)體,保存信息。 二、用尾插法創(chuàng)建一個(gè)鏈表,并讓用戶選擇是否輸入數(shù)據(jù)。 三、將鏈表數(shù)據(jù)

    2024年02月02日
    瀏覽(97)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包