zoukankan      html  css  js  c++  java
  • 《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中,如果不释放不使用的内存的话,那么将会造成内存泄露。

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

      

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

  • 相关阅读:
    Bluetooth architecture (HCI/L2CAP)
    堆栈
    Inside the C++ Object Model 深度探索对象模型 57
    Android音乐播放器
    (一)开发板系统安装
    html5的canvas写一个简单的画板程序
    C++ 获取日历时间
    Incremental Differential vs. Incremental Cumulative Backups
    BCB安装控件出现Unresolved external '__fastcall Outline::TCustomOutline
    Windows 环境下配置 Oracle 11gR2 Data Guard 手记
  • 原文地址:https://www.cnblogs.com/ahl5esoft/p/2574082.html
Copyright © 2011-2022 走看看