C语言入门与提高课件

上传人:我*** 文档编号:144891670 上传时间:2020-09-14 格式:PPT 页数:22 大小:524KB
返回 下载 相关 举报
C语言入门与提高课件_第1页
第1页 / 共22页
C语言入门与提高课件_第2页
第2页 / 共22页
C语言入门与提高课件_第3页
第3页 / 共22页
C语言入门与提高课件_第4页
第4页 / 共22页
C语言入门与提高课件_第5页
第5页 / 共22页
点击查看更多>>
资源描述

《C语言入门与提高课件》由会员分享,可在线阅读,更多相关《C语言入门与提高课件(22页珍藏版)》请在金锄头文库上搜索。

1、C语言入门与提高-5,郝庆晋,内存存储结构,1、栈区(stack)由编译器自动分配释放,存放函数的参数值,局部变量的值等。 2、堆区(heap)一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。 3、读写段 全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后有系统释放 4、只读段常量字符串和函数体的二进制代码就是放在这里的。程序结束后由系统释放,用户进程不可见,栈指针(高到低),全局变量和静态变量,程序代码和只读数据,0 xc0000000,0 x40000000,0 x08048000

2、,低到高,栈和堆,栈:在函数调用时,第一个进栈的是主函数中后的下一条指令(函数调用语句的下一条可执行语句)的地址,然后是函数的各个参数。当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址,也就是主函数中的下一条指令,程序由该点继续运行。 堆:一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容由程序员安排 。,共享库,两个进程共享相同物理页面中的共享库,当然,只有只读的部分是共享的,可读可写的部分不共享。 使用共享库可以大大节省内存。比如libc,系统中几乎所有的进程都映射libc到自己的进程地址空间,而libc的只读部分在物理内存中只需要存在一份,就可以被所有

3、进程共享,这就是“共享库”这个名称的由来了。,动态内存分配,堆区空间应用,为什么使用动态内存分配,程序中需要动态分配一块内存时怎么办呢?可以像以前那样定义一个变长数组。但这种方法不够灵活,C89要求定义的数组是固定长度的,而程序往往在运行时才知道要动态分配多大的内存。 进程有一个堆空间 C标准库函数malloc可以在堆空间动态分配内存,动态分配的内存用完之后可以用free释放,更准确地说是归还给malloc,这样下次调用malloc时这块内存可以再次被分配,malloc和free,#include void * malloc(size_t size); 返回值:成功返回所分配内存空间的首地址,

4、出错返回NULL void free(void *pointer); free(p);之后,p所指的内存空间是归还了,但是p的值并没有变,p现在指向的内存空间已经不属于用户,换句话说,p成了野指针,为避免出现野指针,我们应该free(p)之后手动置p = NULL;,使用动态分配的内存,char * p; char c; p=malloc(sizeof(char)*100); if(p=NULL) printf(”errorn”); return -1; strcpy(p,”hello”); free(p); p=NULL;,练习,用动态分配内存方法重新实现 char *strcat(cons

5、t char *str1,const char *str2) 返回动态分配内存首地址,calloc和realloc,Void *calloc( size_t num, size_t size); 分配num个元素的内存空间,每个元素占size字节,并且calloc负责把这块内存空间用字节0填充 Void *realloc(void * ptr, size_t new_size); 把原内存空间的指针ptr传给realloc,通过参数size指定新的大小(字节数),返回新内存空间的首地址,并释放原内存空间。新内存空间中的数据尽量和原来保持一致,如果size比原来小,则前size个字节不变,后面的

6、数据被截断,如果size比原来大,则原来的数据全部保留,后面长出来的一块内存空间未初始化,练习,1、用calloc函数分配int类型空间,对其赋值和输出 2、验证realloc函数是在原来空间的基础上扩大,还是重新分配更大的空间,把原来的数据复制过去,常见的动态内存错误,1.忘记检查内存是否分配成功 2.访问越界 3.释放并非动态分配的内存 4.释放动态内存的一部分 5.释放动态内存后继续使用,内存泄漏,内存动态分配后,当它未不再被使用时未被释放. 调用malloc分配内存,则必须有free与之配对,分配一次就要释放一次,否则每次循环都分配内存,分配完了又不释放,就会慢慢耗尽系统内存,这种错误

7、称为内存泄漏(Memory Leak)。另外,malloc返回的指针一定要保存好,只有把它传给free才能释放这块内存,如果这个指针丢失了,就没有办法free这块内存了,也会造成内存泄漏。,链表,动态申请的内存空间,实现使用连续空间 head指针是链表的头指针,指向第一个节点,每个节点的next指针域指向下一个节点,最后一个节点的next指针域为NULL,在图中用0表示。,每个链表有一个头指针,通过头指针可以找到第一个节点,每个节点都可以通过指针域找到它的后继,最后一个节点的指针域为NULL,表示没有后继。 数组在内存中是连续存放的,而链表在内存中的布局是不规则的,我们知道访问某个数组元素bn

8、时可以通过基地址+n每个元素的字节数得到它地址,或者说数组支持随机访问,而链表是不支持随机访问的,只能通过前一个元素的指针域得知后一个元素的地址,因此只能从头指针开始顺序访问各节点。,链表的特点,链表的操作,创建链表 结构体做节点 头指针 next指针连接下一个节点 最后一个节点next指针为NULL,struct node int num; struct node * next; ; link p = malloc(sizeof *p); p-num = 5; p-next = NULL;,链表的插入,找到要插入的位置 保存插入位置的下一个节点指针 插入节点,链表的删除,找到要删除的节点 保存删除节点的下一个节点位置 free空间 指针赋NULL,单链表的反转,循环链表,循环链表 双向链表,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > PPT模板库 > PPT素材/模板

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号