zoukankan      html  css  js  c++  java
  • 动态内存分配

    静态分配

    • 在程序编译或运行过程中,按事先规定大小分配内存空间的分配方式。
    • 必须事先知道所需空间的大小。
    • 分配在栈区或全局变量区,一般以数组的形式。
    • 按计划分配。

    动态分配

    • 在程序运行过程中,根据需要大小自由分配所需空间。
    • 分配在堆区,一般使用特定的函数进行分配。
    • 按需分配。

    动态分配内存空间函数

      1.分配内存空间函数  malloc

       • 函数原型:void *malloc(unsigned int num_types);

       • 调用形式:(类型说明符 *) malloc(size)

       • 功能描述:

         • 在内存的动态存储区(堆区)中分配一块长度为size字节的连续区域,用来存放类型说明符指定的类型。

         • 函数原型返回void *指针,使用时必须做相应的强制类型转换。

       • 返回值

         分配成功:返回调用空间的起始地址。

          分配失败:返回NULL。

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    int main(int argc,char *argv[])
    {
        int count,*array,n;
        printf("请输入要申请数组的个数:");
        scanf("%d",&n);
        array = (int *)malloc(n * sizeof(int));
        if(array == NULL)
        {
            printf("申请空间失败
    ");
            return-1;
        }
        memset(array,0,n * sizeof(int));    //将申请到的空间清0
        for(count = 0;count < n;count++)    //给数组赋值
        {
            array[count] = count;
        }
        for(count = 0;count < 0;count++)    //打印数组元素
        {
            printf("%2d",array[count]);
        }
        free(array);
        return 0;
    }

      2.分配内存空间。函数  calloc

       • 调用形式:(类型说明符 *) calloc(n,size)

       • 功能描述:

         在内存的动态存储区(堆区)中分配n块长度为size字节的连续区域。

       • 返回值

          该区域的首地址。

       • calloc和malloc的区别:

         • calloc能一次分配n块连续区域。

         • calloc能对分配的空间初始化为0,而malloc不能,须用memset()或bzero()函数来初始化。

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(int argc,char *argv[])
    {
        int count,*array,n;
        printf("请输入要申请空间的个数:");
        scanf("%d",&n);
       array = (int *)calloc(n,sizeof(int));
        if(array == NULL)
        {
            printf("申请空间失败
    ");
            return -1;
        }
        for(count = 0;count < n;count++)    //给数组赋值
            array[count] = count;
        for(cpunt = 0;count < n;count++)    //打印数组元素
            printf("%2d",array[count]);
        free(array);  
        return 0;
    }

      3.分配内存空间函数  realloc(内存追加)

       • 原型:void *realloc(void *mem_address,unsigned int newsize);

       • 调用形式:指针名 = (数据类型 *)realloc(要改变大小的指针,新的大小);  //新的大小:追加后总的大小

       • 功能说明:

         • 判断当前的指针后面是否有足够的连续空间,如果有,扩大mem_address指向的地址并且将mem_address返回。

         • 若空间不够先按照newsize指定的大小分配空间,将原有数据拷贝到新分配的内存区域,而后释放原来。

       • 返回值:

         返回新分配的内存区域的首地址。

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(int argc,char *argv[])
    {
        int i;
        int *pn = (int *)malloc(5 * sizeof(int));
        for(i = 0;i < 5;i++)
            scanf("%d",&pn[i]);
        pn = (int *)realloc(pn,10 * sizeof(int));
        for(i = 5;i < 10;i++)
            scanf("%d",&pn[i]);
        for(i = 0;i < 10;i++)
            printf("%2d",pn[i]);
        free(pn);  
        return 0;
    }

      4.释放内存空间函数  free

       • 调用形式:free(void *ptr);

       • 功能描述:

         释放ptr所指向的一块内存空间,ptr是一个任意类型的指针变量,指向被释放区域的首地址。

       • 使用说明:

         • 被释放区域应是由malloc、calloc、realloc函数分配的区域。

         • 不释放可能造成内存利用率降低。

         • 对同一内存空间对此释放会出错。

  • 相关阅读:
    首次调用u8api遇到的问题总结
    为datagridview添加自定义按钮
    我对数据库索引的初步了解
    ObjectARX 常见编译错误解决方式记录
    手动修改Visual Studio 版本互转工具
    [经验] FAS 20号指令的深入研究
    Object ARX 统一设置所有图层的RGB颜色
    ARX 选择集获得所有图形 遍历 实例 备忘
    ObjectARX2010 学习笔记002:读取已经存在的DWG文件中的内容
    利用编译时的全局声明对抗反编译
  • 原文地址:https://www.cnblogs.com/lemongirl/p/7892671.html
Copyright © 2011-2022 走看看