《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中,如果不释放不使用的内存的话,那么将会造成内存泄露。

  另外如果试图释放并非动态分配的内存、继续使用已经释放了的内存的话,也将会造成程序或系统的崩溃。

  

  今天就到这里了,明天继续,加油!

优质内容筛选与推荐>>
1、在Sql Server触发器中判断操作是Insert还是Update还是Delete
2、彻底弄懂响应式设计中的em和rem
3、(一) Adroid编译环境配置及获取源码
4、Java异常捕获
5、王俊懿 12.6 计算机专业英语


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号