C-11(動(dòng)態(tài)內(nèi)存分配)_第1頁
C-11(動(dòng)態(tài)內(nèi)存分配)_第2頁
C-11(動(dòng)態(tài)內(nèi)存分配)_第3頁
C-11(動(dòng)態(tài)內(nèi)存分配)_第4頁
C-11(動(dòng)態(tài)內(nèi)存分配)_第5頁
已閱讀5頁,還剩15頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論