c语言动态分配内存相关的几种函数总结

 

 

笔者为C语言新手,想分享并总结下相关学习心得,如有错误,望各位大牛指正。

 

malloc

原型:void *malloc(int byte_size);

作用:动态开辟byte_size个字节的内存空间,不进行初始化,返回指向此内存的指针,此指针所指数据类型没有确定,需要强转。

举例:int *p=(int *)malloc(5*sizeof(int));

例解:动态开辟5*4=20个字节大小的空间,返回空间首地址指针并强转为int *型后赋予指针变量p。

注意:malloc只开辟空间,不初始化,即只将此空间由未占用状态变为已占用状态,空间内存储的具体数据未指定改变。函数返回值是空间首地址,上例中赋给了p变量。

 

calloc

原型:void *calloc(int n,int type_byte_size);

作用:动态开辟n*type_byte_size个字节,将每个字节均初始化为ascii码0,返回指向此内存的指针,此指针所指数据类型没有确定,需要强转。

举例:int *p=(int *)calloc(5,sizeof(int));

例解:动态开辟5*4=20个字节大小的空间,其中每个字节均赋初值0,返回空间首地址指针并强转为int *型后赋予指针变量p。

注意:calloc在malloc的基础上将空间按字节初始化为ascii码0,且其参数有两个,两参数之积为空间总字节数。

 

realloc

原型:void *realloc(void *p,int byte_size);

作用:若p所指空间连续大小(单位字节)大于byte_size,则从首地址开始连续地扩充开辟p所指空间至byte_size字节,不对空间再次赋值,将空间地址指针返回;若p所指空间连续大小小于byte_size,则新开辟byte_size字节大小的空间,将p指向的空间内的数据复制进新空间,之后释放p所指空间(此时p为NULL),返回指向新空间的指针,此指针所指数据类型没有确定,需要强转。

举例:int *p=(int *)calloc(5,sizeof(int));

      p =(int*)realloc(p,10*sizeof(int));

例解:首句中p为5*4=20字节的空间指针并按字节初始化为ascii码0,(int *)强转后才限定了指向空间的每个元素为int型。后句将p所指空间扩充为10*4=40字节的空间指针,未对其二次赋值,故此时p[0]~p[4]为0,p[5]~p[9]未初始化。

注意:realloc的第一个参数必须是动态开辟的地址,不能是静态定义的数组的地址,结构体数组也不行。具体原因我也不清楚...

 

memset

原型:void *memset(void *p,char c,int byte_size);

作用:将p所指的大小为byte_size字节的空间按字节赋值为字符变量c(即指定的ascii码),返回空间首地址指针,此指针所指数据类型没有确定,需要强转。memset所在头文件为memory.h。

举例:int *p=(int *)malloc(5*sizeof(int));

      p =(int*)memset(p,3,5*sizeof(int));

例解:第二句中将p所指空间(5*4个字节大小)按字节赋值为ascii码3,即每个32位均为00000011000000110000001100000011,转化为十进制为50529027。之后将返回的指针强转为(int*)后赋给p。

注意:按字节赋予ascii码值并非按原数据类型赋值,强转后确定数据类型,输出结果会很“奇怪”。

 

测试代码:(malloc省略)

// 动态分配内存测试.cpp: 定义控制台应用程序的入口点。

//

 

#include "stdafx.h"

#include "stdio.h"

#include "stdlib.h"

#include" conio.h"

#include "memory.h"

int _tmain(int argc,_TCHAR* argv[])

{

         int *p;

         p=(int *)calloc(5,sizeof(int));

         if(!p)

         {

                   printf("calloc分配失败1");

                   _getch();

                   exit(0);

         }

         for(int i=0;i<5;++i)

                   printf("c:p[%d]=%d\n",i,p[i]);

         p=(int *)realloc(p,10*sizeof(int));

         if(!p)

         {

                   printf("realloc分配失败2");

                   _getch();

                   exit(0);

         }

         for(int i=0;i<10;++i)

                   printf("r:p[%d]=%d\n",i,p[i]);

         int *q=(int *)memset(p,3,10*sizeof(int));

         if(!q)

         {

                   printf("memset分配失败3");

                   _getch();

                   exit(0);

         }

         p=(int *)memset(p,3,10*sizeof(int));

         for(int i=0;i<10;++i)

                   printf("m:q[%d]=%d\n",i,q[i]);

         for(int i=0;i<10;++i)

                   printf("m:p[%d]=%d\n",i,p[i]);

         free(p);

         q=NULL;

         _getch();

         return0;

}

 

 

运行结果:

 

 

 

 

 

 

 

32位按字节赋ascii码3(每8位均为00000011),转为10进制(DEC)如下:

 

  • 10
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值