动态内存分配

静态分配

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

动态分配

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

动态分配内存空间函数

  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("申请空间失败\n");
        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("申请空间失败\n");
        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函数分配的区域。

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

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

posted @ 2017-11-24 23:00  lemongirl  阅读(398)  评论(0编辑  收藏  举报