C语言 内存动态管理函数

来源:互联网 发布:js身份证号正则表达式 编辑:程序博客网 时间:2024/06/05 05:58

        C语言库函数中提供了程序动态申请和释放内存存储空间的库函数。常用的主要包括(1)malloc 函数,(2)calloc 函数,(3)free 函数 ,(4)realloc 函数。

Ⅰ )malloc 函数

       malloc 函数是使用比较多的申请内存空间的函数,它的作用主要是以字节为单位在内存中开辟指定大小的存储空间。malloc 函数的函数原型为:

    void* malloc(unsignedint size)

       它的形参size 为无符号整型。函数的值为指向void 类型的指针,函数返回值为系统分配给此段空间的起始地址。如果想将这个指针指赋给其他类型的指针变量,应当进行显式的类型转换(强制类型转换),例如:

    malloc(4*sizeof(int));

      用来开辟一个长度为4个整形变量所占空间(16个字节)大小的内存空间。如果想把此地址分配给一个指向long 型的指针变量p,则应进行以下显示转换:

    p =(long*)malloc(4 *sizeof(int));

      指向void 类型是标准ACSI C(ANSI C是由美国国家标准协会(ANSI)及国际标准化组织(ISO)推出的关于C语言的标准。)建议的,现在有的C系统提供的malloc 函数的返回的指针是指向char 型的,其函数原型为:

    char* malloc(unsigned int size)

      在使用指向char 型的函数返回指针,并将它赋给其他类型的指针变量时,也应进行类似的强制类型转换。如果内存缺乏足够大的空间进行分配,则malloc 函数值为“空指针”,即地址为0。

Ⅱ)calloc 函数

        collic 函数原型为:
    void* calloc(unsigned int num, unsigned int size)
       它的两个形参是num 和 size。其作用是分配num 个大小为 size 字节的空间。例如:
    calloc(20, 30);
       可以开辟20个(每个大小为30字节)的空间,即总长为600字节。此函数返回值为该空间的首地址。

Ⅲ)free 函数

       free 函数的原型为:
    void free(void* ptr)

       其作用是将指针变量ptr 指向的存储空间释放,即交还给系统,系统可以另行分配做它用。应当强调,ptr 值不能是任意的地址项,而只能是由在程序中执行过的 malloc 或 calloc 函数所返回的地址。如果随便写:free(100)是不可以的。下面这样用是可以的:

   p =(long*)malloc(18);    ...     free(p);

free 函数把原先开辟的18个字节的空间释放,虽然p 是指向 long 型的,但可以传给指向指向void 型的指针变量ptr ,系统会使其自动转换。free 函数无返回值。

下面是一个malloc() 和 free() 两个函数配合使用的简单实例。

#include<stdio.h>#include<stdlib.h> int main(void){    int* p, t;    p = (int*)malloc(40 * sizeof(int)); //用sizeof(int) 计算int型数据的字节数    if (!p)    {        printf("\t内存已用完!\t");        exit(0);    }    for (t = 0; t < 40; t++)    {        *(p + t) = t;           //将整数t 赋给指针变量p+t 指向的内存    }    for (t = 0; t < 40; t++)    {        printf("%d\t", *(p + t));    }    printf("\n");    free(p);       //利用free函数释放指针变量p开辟的内存空间    return 0;} 程序执行会依次输出0~39共40个整数。

Ⅳ)relloc 函数

       该函数用来使已分配的空间改变大小,即重新分配。其原型为:

    void* realloc(void* ptr,unsigned int size)
       其作用是将ptr指向的存储区(原先用malloc 函数分配的)大小改为size个字节。可以使原先的分配区扩大或缩小。它的函数返回值是一个指针,即新的存储区的首地址。新的首地址不一定与原来的首地址相同,因为改变了空间,存储区会进行必要的移动。

      使用内存管理函数一般需要包含头文件:

#include<stdlib.h>

#include<malloc.h>

两个包含其中一个即可。



         
原创粉丝点击