




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
3G--嵌入式開發(fā)C語言強(qiáng)化(動(dòng)態(tài)內(nèi)存分配)蜚聲騰茂教育科技為什么用動(dòng)態(tài)內(nèi)存分配?一個(gè)問題困擾編程者:在使用數(shù)組的時(shí)候,數(shù)組應(yīng)該有多大?通常我們的做法是:把數(shù)組定義的足夠大。靜態(tài)內(nèi)存分配分配固定大小的內(nèi)存可能浪費(fèi)大量的內(nèi)存空間;可能引起下標(biāo)越界,導(dǎo)致嚴(yán)重后果動(dòng)態(tài)內(nèi)存分配在程序執(zhí)行的過程中動(dòng)態(tài)地分配或者回收存儲空間的分配內(nèi)存不需要預(yù)先分配存儲空間;分配的空間可以根據(jù)程序的需要擴(kuò)大或縮小一個(gè)指向某一類型的指針,在給其賦具體值之前,一定要給他地址。實(shí)現(xiàn)動(dòng)態(tài)內(nèi)存分配及其管理
----指針動(dòng)態(tài)存儲動(dòng)態(tài)存儲分配(dynamicmemoryallocation)使用預(yù)先定義的函數(shù)來為數(shù)據(jù)分配并釋放內(nèi)存Dynamic沒有相應(yīng)的標(biāo)識符,僅有一個(gè)地址,必須在訪問時(shí)使用要訪問在動(dòng)態(tài)存儲中的數(shù)據(jù),必須使用指針。一個(gè)指向某一類型的指針,在給其賦具體值之前,一定要給他地址。畫個(gè)框圖存儲管理函數(shù)塊式存儲分配(malloc)聲明:void*malloc(unsignedintsize);功能:分配一塊內(nèi)存,malloc函數(shù)返回一個(gè)指向所分配的連續(xù)存儲域的起始地址的void型指針;如果分配不成功則會(huì)返回一個(gè)NULL指針。調(diào)用:檢查返回值是否為空pointer=(type*)malloc(sizeof(int));malloc函數(shù)的使用編寫一段代碼,使用malloc函數(shù)動(dòng)態(tài)分配10個(gè)整型存儲區(qū)域,然后進(jìn)行賦值并打印。鄰接存儲分配(calloc)聲明:void*calloc(unsignedn,unsignedsize);功能:分配n塊長度為size字節(jié)的連續(xù)區(qū)域,并且把這段內(nèi)存區(qū)域的數(shù)據(jù)全部清0,返回值是一個(gè)指向所分配的連續(xù)存儲域的起始地址的void型指針;如果分配不成功則會(huì)返回一個(gè)NULL指針。調(diào)用:ps=(structstu*)calloc(2,sizeof(structstu));主要用于為數(shù)組分配內(nèi)存。calloc函數(shù)的應(yīng)用編寫一段代碼,使用calloc函數(shù)動(dòng)態(tài)分配10塊長度為1字節(jié)的連續(xù)區(qū)域,然后進(jìn)行賦值并打印。存儲再分配(realloc)聲明:void*realloc(void*p,unsignedsize);功能:將p指向的對象的長度修改為size字節(jié)。其中p是指向原來內(nèi)存塊的指針執(zhí)行結(jié)果:有足夠的空間用于擴(kuò)大p指向的內(nèi)存塊;如果沒有足夠的空間,則分配一個(gè)size字節(jié)新內(nèi)存塊,原來的數(shù)據(jù)復(fù)制到新內(nèi)存的開頭,釋放原來內(nèi)存,返回新內(nèi)存塊的指針;P為NULL;Size為0,釋放p指向的內(nèi)存,并返回NULL;如果重新分配失敗,則返回NULL,而原來的內(nèi)存不變。realloc函數(shù)的使用編寫一段代碼,使用realloc函數(shù)重新分配內(nèi)存塊,然后進(jìn)行賦值并打印。釋放存儲(free)聲明:voidfree(void*ptr);用法:當(dāng)不再需要由malloc、calloc所分配的存儲位置時(shí),用free來釋放空間。注意:要被釋放的不是指針,而是它們所指向的空間;建議:在釋放存儲之后,立即將指針值設(shè)置為NULL以清空指針錯(cuò)誤:在已經(jīng)釋放存儲之后,使用指針時(shí)一個(gè)常見的編程錯(cuò)誤。動(dòng)態(tài)數(shù)組(dynamicarray)以一個(gè)工程實(shí)例來實(shí)現(xiàn)創(chuàng)建一個(gè)動(dòng)態(tài)數(shù)組并對此動(dòng)態(tài)數(shù)組進(jìn)行處理#include<stdio.h>#include<stdlib.h>#include<limits.h>/*********************************/int**buildtable(void);voidfilltable(int**table);voidprocesstable(int**table);introwminimum(int*rowptr);introwmaximum(int*rowptr);voidprint(int**table);/********************************/intmain(void){ int**table; table=buildtable(); filltable(table); processtable(table); print(table); return0;}int**buildtable(void){ intrownum,colnum; int**table; introw; printf("\nEnterthenumberofrowsinthetable:"); scanf("%d",&rownum); table=(int**)calloc(rownum+1,sizeof(int*)); for(row=0;row<rownum;row++) { printf("Enternumberofintegersinrow%d:",row+1); scanf("%d",&colnum); table[row]=(int*)calloc(colnum+1,sizeof(int)); table[row][0]=colnum; } table[row]=NULL; returntable;}voidfilltable(int**table){
introw=0; intcolumn;
printf("\nNowwefillthetable.\n"); printf("\nForeachrowenterthedata:"); printf("\n==========================\n");
while(table[row]!=NULL) { printf("\nrow%d(%dintergers)====>",row+1,table[row][0]); for(column=1;column<=table[row][0];column++) { scanf("%d",table[row]+column); } row++; } return;}voidprocesstable(int**table){ introw=0; introwmin; introwmax; while(table[row]!=NULL) {
rowmax=rowmaximum(table[row]);rowmin=rowminimum(table[row]); printf("\nInthe%drowtheminimum:%5d",row+1,rowmin); printf("\nInthe%drowthemaximum:%5d",row+1,rowmax); row++; } return;}introwmaximum(int*rowptr){ introwmax=*(rowptr+1); intcolumn; for(column=2;column<=rowptr[0];column++) rowmax=(rowmax>*(rowptr+column)?rowmax:*(rowptr+column)); returnrowmax;}/**************************************************/
introwminimum(int*rowptr){ introwmin=*(rowptr+1); intcolumn; for(column=2;column<=rowptr[0];column++) rowmin=(rowmin<(*(rowptr+column))?rowmin:*(rowptr+column)); returnrowmin;}voidprint(int**table){ introw; intcolumn; printf("\n"); for(row=0;table[row]!=NULL;row++) { for(column=1;column<=table[row][0];column++) printf("%5d",table[row][column]); printf("\n"); }}陷阱之一:忘記初始化未初始化的指針變量的值不確定陷阱之二:野指針指向的地址空間已經(jīng)被釋放的指針“野指針”不是NULL指針,是指向“垃圾”內(nèi)存的指針。并且野指針很危險(xiǎn),if語句對它不起作用。成因:指針變量沒有被初始化;指針p被free和delet
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 江西師范高等??茖W(xué)校《數(shù)學(xué)課程標(biāo)準(zhǔn)分析》2023-2024學(xué)年第二學(xué)期期末試卷
- 江蘇省泰興市濟(jì)川實(shí)驗(yàn)中學(xué)2024-2025學(xué)年中考化學(xué)試題模擬題及解析(全國卷Ⅲ:)含解析
- 遼寧科技學(xué)院《現(xiàn)代辦公技術(shù)應(yīng)用》2023-2024學(xué)年第二學(xué)期期末試卷
- 西安城市建設(shè)職業(yè)學(xué)院《植物生物技術(shù)概論》2023-2024學(xué)年第二學(xué)期期末試卷
- 內(nèi)蒙古經(jīng)貿(mào)外語職業(yè)學(xué)院《國際經(jīng)濟(jì)地理》2023-2024學(xué)年第二學(xué)期期末試卷
- 山大附屬中學(xué)2024-2025學(xué)年高三一診練習(xí)四化學(xué)試題含解析
- 模特聘用合同書
- 二零二五版按提成收入的協(xié)議書
- 電商運(yùn)營分成合同二零二五年
- 委托獨(dú)家中介房屋買賣服務(wù)合同書二零二五年
- 各國關(guān)于數(shù)據(jù)與個(gè)人隱私的法律規(guī)定
- 人教版(PEP)五年級英語下冊(U1-U4)單元專題訓(xùn)練(含答案)
- 維生素K2行業(yè)研究、市場現(xiàn)狀及未來發(fā)展趨勢(2020-2026)
- 定遠(yuǎn)縣蔡橋水庫在建工程實(shí)施方案
- 繪本故事《三只小豬蓋房子》課件
- GB 13296-2013 鍋爐、熱交換器用不銹鋼無縫鋼管(高清版)
- 部編版八年級語文下冊寫作《學(xué)寫讀后感》精美課件
- LED顯示屏項(xiàng)目立項(xiàng)報(bào)告(模板參考)
- 最新版電梯日常維護(hù)保養(yǎng)記錄
- 發(fā)燒的地球ppt課件
- 區(qū)間盾構(gòu)始發(fā)關(guān)鍵節(jié)點(diǎn)評估報(bào)告
評論
0/150
提交評論