c语言程序设计---(动态内存分配)考研复试面试问答
动态内存分配
1、malloc函数
2、calloc函数
3、realloc函数
4、常见的动态内存错误
动态内存分配
1、malloc函数
C语言提供了一个动态内存开辟的函数:
void*malloc (size_t size);
- 这个函数向内存申请一块连续可用的空间,并返回指向这块空间的指针。
- 如果开辟成功,则返回一个指向开辟好空间的指针。
- 如果开辟失败,则返回一个null指针。因此malloc函数的返回值一定要给做检查
- 返回值的类型是void*,所以malloc函数并不知道开辟空间的类型,具体在使用的时候使用者自己来定义。
- 如果参数size为零,malloc的行为标准是未定义的,取决于编译器。
C语言提供了另外一个函数free专门用来做动态内存的释放和回收的。
当动态申请的空间不再使用的时候,应该还给操作系统。 malloc和free应该搭配成对使用。
如果没有回收,可能导致内存泄漏的问题
2、calloc函数
calloc函数也是动态内存分配。
void* calloc (size_t num,size_t size);
calloc函数功能是为num个大小为的size的元素开辟一块空间,并把空间的每个字节初始化为0.
与函数malloc的区别只在于他会在返回地址之前把申请的空间的每个字节初始化为全0。
3、realloc函数
realloc函数调整动态内存空间的大小。比如在使用malloc函数开辟20个字节空间,但是20个字节不能满足使用了,希望能够有四十个字节的空间,这时就需要用realloc函数来调整动态开辟的内存。
realloc函数使用的注意事项:
- 如果P指向的空间之后有足够的内存空间可以追加,则可以直接追加,后返回P。
- 如果P指向的空间之后没有足够的内存空间可以追加,则realloc函数会重新找一个新的内存区域,开辟一块满足需求的空间,并且把原来内存的数据拷贝回来,释放旧的内存空间。最后返回新开辟的内存空间地址。
- 得用一个新的变量来接收realloc函数的返回值。
4、常见的动态内存错误
(1)对null进行解引用操作
(2)对动态开辟的内存访问越界,
(3)对非动态开辟内存使用free释放。就是没有使用malloc函数,直接释放
(4)使用free释放动态开辟内存的一部分。就是释放的时候必须从首元素那个建立内存开始的时候进行释放,而不能在进行操作过程中,p指针指向内存中间位置,或者操作完指针p指向内存的最后的位置时释放。
(5)对同一块动态内存多次释放。比如开辟了一次内存空间,但是使用了多次free(p);为了避免这种现象,建议释放内存同时把指针p置为null
free(p);
p=null;
(6)动态开辟内存忘记释放,(会导致内存泄漏)。