C程序设计C程序设计 (82).pdf
《C程序设计C程序设计 (82).pdf》由会员分享,可在线阅读,更多相关《C程序设计C程序设计 (82).pdf(36页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、C C程序设计程序设计Programming in CProgramming in C使用动态内存使用动态内存1、动态内存的应用C C程序设计程序设计程序设计程序设计3 37.6.3 7.6.3 动态内存的应用动态内存的应用虽然动态内存分配适用于所有数据类型,但通常用于数组、字符串、字符串数组、自定义类型及复杂数据结构类型。4 47.6.3 7.6.3 动态内存的应用动态内存的应用动态内存不同于静态内存,在实际编程中,需要注意以下几点:(1)静态内存管理由编译器进行,程序员只做对象定义(相当于分配),而动态内存管理按程序员人为的指令进行。5 57.6.3 7.6.3 动态内存的应用动态内存的应
2、用(2)动态内存分配和释放必须对应,即有分配就必须有释放,不释放内存会产生“内存泄漏”,后果是随着程序运行多次,可以使用的内存空间越来越少;另一方面,再次释放已经释放的内存空间,会导致程序出现崩溃性错误。6 67.6.3 7.6.3 动态内存的应用动态内存的应用(3)静态分配内存的生命期由编译器自动确定,要么是程序运行期,要么是函数执行期。动态分配内存的生命期由程序员决定,即从分配时开始,至释放时结束。特别地,动态分配内存的生命期允许跨多个函数。7 77.6.3 7.6.3 动态内存的应用动态内存的应用(4)静态分配内存的对象有初始化,动态分配内存一般需要人为的指令赋初始值。(5)避免释放内存
3、后出现“迷途指针”,应及时设置为空指针。8 87.6.3 7.6.3 动态内存的应用动态内存的应用【例7.25】在不同函数中分配、使用、释放动态内存。9 97.6.3 7.6.3 动态内存的应用动态内存的应用例7.251#include#include 2#include#include 3 intint*f1f1(intint n n)4 /分配n个整型内存,返回首地址/分配n个整型内存,返回首地址5 intint*p p,i i;6 p p=(=(intint*)*)mallocmalloc(n n*sizeofsizeof(intint););/分配/分配7 forfor(i i=0 0
4、;i i-0 0)printfprintf(%d,*(%d,*p p+);+);13 14 voidvoid f3f3(intint*p p)15 /释放内存/释放内存10107.6.3 7.6.3 动态内存的应用动态内存的应用例7.2516 freefree(p p););17 18 intint mainmain()()19 20 intint*pipi;21 pipi=f1f1(5 5););/分配/分配22 f2f2(pipi,5 5););/输出/输出23 f3f3(pipi););/释放/释放24 returnreturn 0 0;25 11117.6.3 7.6.3 动态内存的应
5、用动态内存的应用例7.251#include#include 2#include#include 3 intint*f1f1(intint n n)4 /分配n个整型内存,返回首地址/分配n个整型内存,返回首地址5 intint*p p,i i;6 p p=(=(intint*)*)mallocmalloc(n n*sizeofsizeof(intint););/分配/分配7 forfor(i i=0 0;i i n n;i i+)+)p p i i=i i;/赋初始值/赋初始值8 returnreturn p p;9 第6行分配n个整型内存单元,第7行给分配到的每个内存单元赋初始值。1212
6、7.6.3 7.6.3 动态内存的应用动态内存的应用例7.2518 intint mainmain()()19 20 intint*pipi;21 pipi=f1f1(5 5););/分配/分配22 f2f2(pipi,5 5););/输出/输出23 f3f3(pipi););/释放/释放24 returnreturn 0 0;25 13137.6.3 7.6.3 动态内存的应用动态内存的应用1动态分配数组使用动态内存,可以轻而易举地解决本节开始提出的问题:在程序运行时产生任意大小的“数组”。14147.6.3 7.6.3 动态内存的应用动态内存的应用动态分配一维或多维数组的方法是由指针管理数
7、组,二维以上数组按一维数组方式来处理,具体步骤为:定义指针p;分配数组空间,用来存储数组元素,空间大小按元素个数计算;按一维数组方式使用这个数组(例如输入、输出等);若是一维数组,则元素为pi;若是二维数组,则元素为pi*M+j,其中M为列元素个数,以此类推。释放数组空间;15157.6.3 7.6.3 动态内存的应用动态内存的应用【例7.26】计算n阶行列式的值(n由键盘输入)。16167.6.3 7.6.3 动态内存的应用动态内存的应用例7.261#include#include 2#include#include 3 doubledouble HLSHLS(doubledouble*A
8、A,intint N N)/HLS(double ANN,int N)/HLS(double ANN,int N)4 /计算N阶行列式/计算N阶行列式5 intint i i,j j,m m,n n,s s,t t,k k=1 1;6 doubledouble f f=1.01.0,c c,x x;7 forfor(i i=0 0,j j=0 0;i i N N&j j N N;i i+,+,j j+)+)8 ifif(A A i i*N N+j j=0 0)/Aij 检查主对角线是否为0/Aij 检查主对角线是否为09 forfor(m m=i i+1 1;m m N N&A A m m*N
9、 N+j j=0 0;m m+);+);/Amj/Amj10 ifif(m m=N N)returnreturn 0 0;/全为0则行列式为0/全为0则行列式为011 elseelse12 forfor(n n=j j;n n i i;s s-)-)/列变换化成上三角行列式/列变换化成上三角行列式20 x x=A A s s*N N+j j;/Asj/Asj21 forfor(t t=j j;t t N N;t t+)+)/Ast-=Ait*(x/Aij)/Ast-=Ait*(x/Aij)22 A A s s*N N+t t-=-=A A i i*N N+t t*(*(x x/A A i i*
10、N N+j j););23 24 25 forfor(i i=0 0;i i N N;i i+)+)f f*=*=A A i i*N N+i i;/Aii/Aii26 returnreturn k k*f f;27 28 intint mainmain()()29 30 intint i i,j j,n n=4 4;18187.6.3 7.6.3 动态内存的应用动态内存的应用例7.2631 doubledouble*A A;32 scanfscanf(%d,&(%d,&n n););33 A A=mallocmalloc(n n*n n*sizeofsizeof(doubledouble);)
11、;/分配“数组”Ann/分配“数组”Ann34 forfor(i i=0 0;i i n n;i i+)+)35 forfor(j j=0 0;j j n n;j j+)+)36 scanfscanf(%lf,(%lf,A A+i i*n n+j j););/输入数据到Aij/输入数据到Aij37 printfprintf(detA=%lf(detA=%lfnn,HLSHLS(A A,n n););38 freefree(A A););/释放“数组”/释放“数组”39 returnreturn 0 0;40 19197.6.3 7.6.3 动态内存的应用动态内存的应用例7.261#includ
12、e#include 2#include#include 3 double HLS(double*A,int N)/HLS(double ANN,int N)double HLS(double*A,int N)/HLS(double ANN,int N)4 /计算N阶行列式/计算N阶行列式5 int i,j,m,n,s,t,k=1;int i,j,m,n,s,t,k=1;6 double f=1.0,c,x;double f=1.0,c,x;7 for(i=0,j=0;iN&jN;i+,j+)for(i=0,j=0;iN&jN;i+,j+)8 if(Ai*N+j=0)/Aij 检查主对角线是否为
13、0if(Ai*N+j=0)/Aij 检查主对角线是否为09 for(m=i+1;mN&Am*N+j=0;m+);/Amjfor(m=i+1;mN&Am*N+j=0;m+);/Amj10 if(m=N)return 0;/全为0则行列式为0if(m=N)return 0;/全为0则行列式为011 elseelse12 for(n=j;nN;n+)/两行交换for(n=j;nN;n+)/两行交换13 c=Ai*N+n;/Ainc=Ai*N+n;/Ain14 Ai*N+n=Am*N+n;/Ain=Amn;Ai*N+n=Am*N+n;/Ain=Amn;15 Am*N+n=c;/AmnAm*N+n=c;
14、/AmndetA=40.00000043 1-1 2-5 1 3-4 2 0 1-1 1-5 3-320207.6.3 7.6.3 动态内存的应用动态内存的应用2动态分配字符串实际编程中,字符串类型表示文字信息数据,其特点是字符长度不固定。通过动态分配字符串,根据程序的需要确定字符串的实际长度。21217.6.3 7.6.3 动态内存的应用动态内存的应用动态分配字符串的方法是由字符指针管理字符串,具体步骤为:定义字符指针;分配字符串空间,用来存储字符串;使用这个字符串(例如输入、输出等);释放字符串空间;22227.6.3 7.6.3 动态内存的应用动态内存的应用例如:1#include#in
15、clude 2#include#include 3 intint mainmain()()4 5 charchar*p p;/字符串指针/字符串指针6 p p=(=(charchar*)*)mallocmalloc(10001000*sizeofsizeof(charchar););/分配字符串空间/分配字符串空间7 getsgets(p p););/输入字符串/输入字符串8 putsputs(p p););/输出字符串/输出字符串9 freefree(p p););/释放字符串空间/释放字符串空间10 returnreturn 0 0;11 23237.6.3 7.6.3 动态内存的应用动态
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C程序设计C程序设计 82 程序设计 82
限制150内