C标准库函数(一)---内存分配

#include <stdlib.h>
#include <stdio.h> // for printf getchar

/*
VS平台不提供以下两个h文件
#include <syslib.h>
#include <alloc.h>
*/

int main()
{
    char *p;
        
     system("cls");      // clear screen TC环境中可使用clrscr();而VS平台不提供此接口

	//malloc sample
    p=(char *)malloc(sizeof(char));
    if(p)
        printf("malloc success! Memory Allocated at: %x\n",p);
    else
        printf("malloc failed!\n");

	//realloc sample
	p=(char *)realloc(p,256);
    if(p)
        printf("realloc success! Memory Reallocated at: %x\n",p);
    else
        printf("realloc failed!\n");

    free(p);


	//calloc sample
	p=(char *)calloc(100,sizeof(char));
    if(p)
        printf("calloc success! Memory Allocated at: %x\n",p);
    else
        printf("calloc failed!\n");
          
    free(p);
        
    getchar();
    return 0;
}

概述

        C标准库函数里,与内存分配相关的包含以下四个函数:malloc、realloc、calloc和free。 其中,前三个用于申请内存空间,最后一个用于释放所申请的空间。故为了保证资源使用完毕能正确回收, 无论调用前三者中的哪一个,在函数结束时,都要调用free来释放。


说明

        先简单看下前四个函数的原型及功能说明:

        malloc

        原型:extern void *malloc(unsigned int num_bytes);

        功能:分配长度为num_bytes字节的内存块


         calloc

        原型:extern void *calloc(int num_elems, int elem_size);
 
        功能:为具有num_elems个长度为elem_size元素的数组分配内存



        realloc
        原型:extern void *realloc(void *mem_address, unsigned int newsize);
 
        功能:改变mem_address所指内存区域的大小为newsize长度。


        说明:如果分配成功则返回指向被分配内存的指针,否则返回空指针NULL。

        当内存不再使用时,应使用free()函数将内存块释放。


        free

        原型:extern void free(void *p);

        功能:释放指针p所指向的的内存空间。

        说明:p所指向的内存空间必须是用calloc,malloc,realloc所分配的内存。 如果p为NULL或指向不存在的内存块则不做任何操作。


区别与联系

       区别:

       1、malloc和realloc都是用来分配一定长度字节的内存块,而calloc用来分配数组的内存,其大小是num_elems*elem_size

        2、malloc、realloc、calloc用来申请内存,free用来释放内存


        联系:

        1、realloc必须是在调用malloc之后,改变内存长度时使用, calloc则可单独使用

        2、无论调用malloc、realloc或calloc,都要在函数结束时调用free,防止内存无法正确释放


代码示例

        如上所示, 在VS2010下编译运行通过。

        注:

        1、调用malloc后的内存地址,与紧接着调用realloc返回的地址可能不同

        2、调用malloc后释放, 再调用calloc的返回地址与之前的地址不同

        3、调用malloc、realloc后释放,再调用calloc的返回地址与之前的地址可能相同

       

       
      

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值