C语言入门与提高课件.ppt

C语言入门与提高课件.ppt

ID:57057011

大小:524.00 KB

页数:22页

时间:2020-07-30

C语言入门与提高课件.ppt_第1页
C语言入门与提高课件.ppt_第2页
C语言入门与提高课件.ppt_第3页
C语言入门与提高课件.ppt_第4页
C语言入门与提高课件.ppt_第5页
资源描述:

《C语言入门与提高课件.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

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

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

3、存。比如libc,系统中几乎所有的进程都映射libc到自己的进程地址空间,而libc的只读部分在物理内存中只需要存在一份,就可以被所有进程共享,这就是“共享库”这个名称的由来了。动态内存分配堆区空间应用为什么使用动态内存分配程序中需要动态分配一块内存时怎么办呢?可以像以前那样定义一个变长数组。但这种方法不够灵活,C89要求定义的数组是固定长度的,而程序往往在运行时才知道要动态分配多大的内存。进程有一个堆空间C标准库函数malloc可以在堆空间动态分配内存,动态分配的内存用完之后可以用free释放,更准确地说是归还给

4、malloc,这样下次调用malloc时这块内存可以再次被分配malloc和free#includevoid*malloc(size_tsize);返回值:成功返回所分配内存空间的首地址,出错返回NULLvoidfree(void*pointer);free(p);之后,p所指的内存空间是归还了,但是p的值并没有变,p现在指向的内存空间已经不属于用户,换句话说,p成了野指针,为避免出现野指针,我们应该free(p)之后手动置p=NULL;使用动态分配的内存char*p;charc;p=mallo

5、c(sizeof(char)*100);if(p==NULL){printf(”error”);return-1;}strcpy(p,”hello”);free(p);p=NULL;练习用动态分配内存方法重新实现char*strcat(constchar*str1,constchar*str2)返回动态分配内存首地址calloc和reallocVoid*calloc(size_tnum,size_tsize);分配num个元素的内存空间,每个元素占size字节,并且calloc负责把这块内存空间用字节0填充Vo

6、id*realloc(void*ptr,size_tnew_size);把原内存空间的指针ptr传给realloc,通过参数size指定新的大小(字节数),返回新内存空间的首地址,并释放原内存空间。新内存空间中的数据尽量和原来保持一致,如果size比原来小,则前size个字节不变,后面的数据被截断,如果size比原来大,则原来的数据全部保留,后面长出来的一块内存空间未初始化练习1、用calloc函数分配int类型空间,对其赋值和输出2、验证realloc函数是在原来空间的基础上扩大,还是重新分配更大的空间,把原来的

7、数据复制过去常见的动态内存错误1.忘记检查内存是否分配成功2.访问越界3.释放并非动态分配的内存4.释放动态内存的一部分5.释放动态内存后继续使用内存泄漏内存动态分配后,当它未不再被使用时未被释放.调用malloc分配内存,则必须有free与之配对,分配一次就要释放一次,否则每次循环都分配内存,分配完了又不释放,就会慢慢耗尽系统内存,这种错误称为内存泄漏(MemoryLeak)。另外,malloc返回的指针一定要保存好,只有把它传给free才能释放这块内存,如果这个指针丢失了,就没有办法free这块内存了,也会造成

8、内存泄漏。链表动态申请的内存空间,实现使用连续空间head指针是链表的头指针,指向第一个节点,每个节点的next指针域指向下一个节点,最后一个节点的next指针域为NULL,在图中用0表示。每个链表有一个头指针,通过头指针可以找到第一个节点,每个节点都可以通过指针域找到它的后继,最后一个节点的指针域为NULL,表示没有后继。数组在内存中是连续存放的,而链表在

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。