经过前面一段时间的学习,学习到了 一系列的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.对同一块动态内存的多次释放。
加油。