学习小结

来源:互联网 发布:win10重装linux子系统 编辑:程序博客网 时间:2024/06/10 05:13

经过前面一段时间的学习,学习到了 一系列的str :  strlen,strcat,strcmp,strcpy,strstr.学习到这里的时候 感觉 程序语言其实也是挺有趣的。

前天学习到内存分配的时候

{

栈:局部变量,形式参数。

堆:动态内存。

静态区:静态变量和全局变量。

}

学习到了一个新的知识:动态内存。

而为什么要提到动态内存,因为在我们进行 编译的时候,一个数组的长度只有在运行的时候才能够知道,但是不同的情况下 需求的空间大小也不一样,一般都是申请一个能够容纳最多元素的数组,这样存在一定的空间浪费,并且灵活性不够。

为了使数组 永远不会溢出,动态内存很好的解决了这个问题。给定一个初始大小,然后再需要的空间增加的 实现增容。就像我们使用的通讯录一样,给定一个不大的内存空间存放有限小的人数,当需要存储的人数变多,也实现动态的增加,不会造成空间的浪费,也不会因为达到上限而烦恼。


malloc:执行动态内存分配。

free:内存的释放。

在我看来,free 这个函数是动态内存部分最关键的 一环,在申请空间并使用之后返还内存,如果不进行free这项操作的话,会导致程序运行时一直占用系统内存,最终导致系统崩溃,所以说free 这个函数是在进行malloc之后必须进行的一项操作。

而malloc则就是分配合适的内存块,提供其指针,但是不会对内存块进行初始化,一切的初始化需要自己手动进行。

因为malloc不进行初始化,所以有了calloc这个函数。

calloc在返回指向内存块的指针之后 就对其进行了初始化,相当于 malloc和memoset的集合。方便了使用者的操作,但是当你只是相对数值进行存储的话,calloc就比malloc更加浪费时间了。

还有一个realloc函数,其主要作用就是在需要增容时直接在后面添加一个空间,而当后面的空间不够是开辟一块足够大小的空间,将之前空间的内容拷贝过来,并将之前的空间进行释放。

动态空间的使用必须是严谨的,需要注意一下几点:

1.对空指针进行解引用。

2.对动态内存的越界。

3.释放非动态内存。

4.释放动态内存的一部分。

5.再次访问已经释放的内存空间。

6.对同一块动态内存的多次释放。


加油。


0 0