C语言——动态内存分配

 

内存分配函数:
malloc函数--分配内存块,但是不对其进行初始化。
calloc函数--分配内存块,并且对其进行初始化(清0)。
realloc函数--调整先前分配的内存块大小。

 

函数原型:
void* malloc(unsigned size);
void* realloc(void* ptr, unsigned newsize);  
void* calloc(size_t numElements, size_t sizeOfElement); 

 

参数说明:
(1)malloc函数:参数size为需要分配的内存空间的长度。
(2)realloc函数:参数ptr为原有的空间地址,newsize是重新申请的地址长度。
(3)calloc函数:参数sizeOfElement为申请地址的单位元素长度,numElements为元素个数。

 

验证代码:

#include <stdio.h>
#include <stdlib.h> 

#define ALLOT_SIZE   40   //分配长度

int main(void)
{
    int i = 0;   //分配了4个字节,静态分配
    int len = ALLOT_SIZE;
    int *p,*q;
	
    //malloc
    //在内存的动态存储区中分配一块长度为len字节的连续区域,返回该区域的首地址
    p = (int *)malloc(len);  
    if(NULL == p)
    {
        printf("malloc failed");
    }
	
    printf("malloc address:%p\n",p);
    for(i = 0; i < len / sizeof(int); i++)
    {
	printf("malloc result%d:%d\n",i,p[i]);
    }
	
    printf("\n");
	
    //calloc
    //在内存中申请ALLOT_SIZE*sizeof(int)字节大小的连续地址空间
    q = calloc(ALLOT_SIZE,sizeof(int));
    if(NULL == q)
    {
	printf("calloc failed");
    }
	
    printf("calloc address:%p\n",q);
    for(i = 0; i < ALLOT_SIZE / sizeof(int); i++)
    {
	printf("calloc result%d:%d\n",i,q[i]);
    }
	
    printf("\n");
	
    //malloc初始化
    memset(p,-1,len);
    printf("malloc address:%p\n",p);
    for(i = 0; i < len / sizeof(int); i++)
    {
	printf("result%d:%d\n",i,p[i]);
    }
  
    printf("\n");
	
    //realloc
    //给一个已经分配了地址的指针重新分配空间
    p = realloc(p,len * 2);
    if(NULL == p)
    {
	printf("realloc failed");
    }
	
    //memset(p,0,len * 2);
    printf("realloc address:%p\n",p);
    for(i = 0; i < len * 2 / sizeof(int); i++)
    {
	printf("realloc result%d:%d\n",i,p[i]);
    }
	
    //释放空间
    free(p);
    free(q);
}

动态的内存分配适用于所有类型的数据,但是主要用于字符串、数组和结构。利用动态分配,可以设计出能根据需要扩大或缩小的数据结构,例如表、树或者其他数据结构。

 

静态内存和动态内存的比较 
静态内存是由系统自动分配、自动释放
静态内存是在分配的 。

动态内存是由程序员手动分配、手动释放
动态内存是在分配的。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值