《c和指针》笔记10--动态分配内存
因为数组存储在内存中连续的位置上,当使用一个数组在运行时才知道长度的情况下,我们就可以使用动态内存分配。
对于声明时就指定长度的数组来讲,主要有以下几个缺点:
1、需要使用的元素超过数组的长度
2、将数组声明得较大,但是某些情况下的数组元素较少时,浪费比较大
3、使用的元素超过数组长度时,程序必须以一种合理的方式做出相应,而不应该导致异常。
显然动态内存可以让我们在使用的时候不用在意元素的数量大小,我们可以在运行时,使用malloc函数来获取动态内存,如:10、20、30个int所需的内存。
但是malloc并不是每次都能将你所需要的内存返回给你,当某些极少数的情况下,malloc未申请到你所需要的内存时,将会返回NULL,因此在程序中,应该对malloc返回的指针进行检查。
对于malloc的内存块指针,我们需要手动对这块内存进行初始化,如果不想自己手动将其初始化为0的话,可以使用calloc函数,它在返回指针之前会将其初始化为0。
如果想修改原有的内存大小的话,可以使用realloc函数。以上几个函数的原型如下:
void *malloc( size_t size ); void *calloc( size_t num_elements, size_t element_size ); void realloc( void *pt, size_t new_size );
那么在使用的过程当中,首先是再次要提醒的是,对于返回的指针需要进行NULL的检查,在操作返回的内存时,也要注意不要越过边界。
因为你并不能保证,你所访问的超过边界的内存是一个空的内存,其上没有存储其他的数据,如果存在其他的数据,那么当你试图改变或转换该数据时,程序将会崩溃或者晚些时候崩溃。
因此可以是用#define定义一个不易发生错误的内存分配器。
对于使用有垃圾回收机制的语言的人可能不习惯自己去释放内存,然而在C中,如果不释放不使用的内存的话,那么将会造成内存泄露。
另外如果试图释放并非动态分配的内存、继续使用已经释放了的内存的话,也将会造成程序或系统的崩溃。
今天就到这里了,明天继续,加油!