C-11(动态内存分配)_第1页
C-11(动态内存分配)_第2页
C-11(动态内存分配)_第3页
C-11(动态内存分配)_第4页
C-11(动态内存分配)_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

3G--嵌入式开发C语言强化(动态内存分配)蜚声腾茂教育科技为什么用动态内存分配?一个问题困扰编程者:在使用数组的时候,数组应该有多大?通常我们的做法是:把数组定义的足够大。静态内存分配分配固定大小的内存可能浪费大量的内存空间;可能引起下标越界,导致严重后果动态内存分配在程序执行的过程中动态地分配或者回收存储空间的分配内存不需要预先分配存储空间;分配的空间可以根据程序的需要扩大或缩小一个指向某一类型的指针,在给其赋具体值之前,一定要给他地址。实现动态内存分配及其管理

----指针动态存储动态存储分配(dynamicmemoryallocation)使用预先定义的函数来为数据分配并释放内存Dynamic没有相应的标识符,仅有一个地址,必须在访问时使用要访问在动态存储中的数据,必须使用指针。一个指向某一类型的指针,在给其赋具体值之前,一定要给他地址。画个框图存储管理函数块式存储分配(malloc)声明:void*malloc(unsignedintsize);功能:分配一块内存,malloc函数返回一个指向所分配的连续存储域的起始地址的void型指针;如果分配不成功则会返回一个NULL指针。调用:检查返回值是否为空pointer=(type*)malloc(sizeof(int));malloc函数的使用编写一段代码,使用malloc函数动态分配10个整型存储区域,然后进行赋值并打印。邻接存储分配(calloc)声明:void*calloc(unsignedn,unsignedsize);功能:分配n块长度为size字节的连续区域,并且把这段内存区域的数据全部清0,返回值是一个指向所分配的连续存储域的起始地址的void型指针;如果分配不成功则会返回一个NULL指针。调用:ps=(structstu*)calloc(2,sizeof(structstu));主要用于为数组分配内存。calloc函数的应用编写一段代码,使用calloc函数动态分配10块长度为1字节的连续区域,然后进行赋值并打印。存储再分配(realloc)声明:void*realloc(void*p,unsignedsize);功能:将p指向的对象的长度修改为size字节。其中p是指向原来内存块的指针执行结果:有足够的空间用于扩大p指向的内存块;如果没有足够的空间,则分配一个size字节新内存块,原来的数据复制到新内存的开头,释放原来内存,返回新内存块的指针;P为NULL;Size为0,释放p指向的内存,并返回NULL;如果重新分配失败,则返回NULL,而原来的内存不变。realloc函数的使用编写一段代码,使用realloc函数重新分配内存块,然后进行赋值并打印。释放存储(free)声明:voidfree(void*ptr);用法:当不再需要由malloc、calloc所分配的存储位置时,用free来释放空间。注意:要被释放的不是指针,而是它们所指向的空间;建议:在释放存储之后,立即将指针值设置为NULL以清空指针错误:在已经释放存储之后,使用指针时一个常见的编程错误。动态数组(dynamicarray)以一个工程实例来实现创建一个动态数组并对此动态数组进行处理#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"); }}陷阱之一:忘记初始化未初始化的指针变量的值不确定陷阱之二:野指针指向的地址空间已经被释放的指针“野指针”不是NULL指针,是指向“垃圾”内存的指针。并且野指针很危险,if语句对它不起作用。成因:指针变量没有被初始化;指针p被free和delet

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论