c语言-存储空间的分配及释放

c语言–存储空间的分配及释放

c语言标准函数库中有malloc(),calloc(),realloc(),free() 4个函数用来实现内存的动态分配和释放,malloc()函数和free()函数最常用,下面来介绍这四个函数。
1. malloc()函数——动态分配一段内存空间
malloc()函数原型:

void*malloc(unsigned int size);

该函数包含在头文件stdlib.h中;
功能:在内存的动态存储区申请一个长度为 size 字节的连续存储空间。malloc()函数会返回一个指针,指向所分配空间的起始地址。如果没有足够的内存空间可分配,则返回空指针NULL。

其参数常使用c语言提供的类型长度运算符sizeof()来计算计算申请空间大小。
例 1 :

int  *a = ( int  *) malloc (sizeof( int ) ;

申请一个 int 类型长度的存储空间,并将分配到的存储空间地址转换为 int 类型地址,赋给所定义的指针变量 a ,字节数为 int 所占的空间。
例 2 :

struct  stu *a = ( struct  stu *) malloc (sizeof( int ));

申请可存放struct stu结构体类型数据的空间,将其地址存入指针 a 中。
使用malloc函数动态分配空间):

#include <stdio.h>
#include <stdlib.h>
int main ()
{
    int *a=(int *)malloc(sizeof(int));
    *a=100;
    printf("%d\n",*a);
    return 0;
}

如果申请了一个长度为10的数组,存数是想存11个数就要对数组进行扩容:
例(数组扩容):

#include<stdio.h>
#include<stdlib.h>
int * f(int *a,int *asize)
{
    int *newa=(int *)malloc(sizeof(*asize)*2);
    for(int i=0;i<*asize;i++)
    {
       newa[i]=a[i];
    }
    *asize=(*asize)*2;
    free(a);
    return newa;
}
int main()
{
    int asize=10,k=0,t;
    int *a=(int *)malloc(sizeof(int)*asize);
    while(scanf("%d",&t),t!=0)
    {
          if(k>=asize) a=f(a,&asize);
          a[k]=t;
          k++;
     }
     for(int i=0;i<k;i++)
     {
          printf("%d ",a[i]);
     }
    return 0;
}

这样就可以实时对数组进行扩容。

2.calloc()函数——动态分配连续内存空间
calloc()函数原型:

void * calloc ( unsigned int n , unsigned int size );

该函数包含在头文件stdlib.h中;
功能:在内存申请n个长度为 size 字节的存储空间,并返回该存储空间的起始地址,如果没有足够的内存空间可分配,则返回空指针NULL。
例:

int *a=(int *)calloc(10,sizeof(int));

用malloc函数实现为:

int *a=(int *)malloc(sizeof(int)*10);

3.relloc()函数——改变指针指向空间大小
relloc()函数原型:

void *realloc(void *ptr,size_t size);

该函数包含在头文件stdlib.h中;
功能:改变ptr指针指向大小为 size 的空间。返回值是一个新地址的指针,若出现错误,则返回NULL。
例 (改变一个浮点型空间大小为整型):

aFloat=(float *) malloc (sizeof(float));
bint=realloc( aFloat , sizeof( int ));

其中aFloat是指向分配的浮点型空间,然后使用 realloc() 函数改变aFloat指向空间的大小,将大小设置为整型,然后将改变后的内存空间的地址返回赋值给bint指针;

4.free()函数——释放内存空间
free()函数原型:

void free(void *p)

功能:将指针变量 p 指向的存储空间释放,交还给系统。free()函数无返回值。p只能是程序最后一次调用malloc()或calloc()函数所返回的地址。
例:

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int *a;
    a=(int *)malloc(size(a));
    *a=100;
    printf("%d\n",*a);
    free(a);
    printf("%d\n",*a);
    return 0;
}

第一次输出为100;
第二次输出前已经调用free()函数将空间释放,数据已不存在因此输出一个随机的值。

猜你喜欢

转载自blog.csdn.net/qq_44200693/article/details/86664950