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个字节,将每个字节均初始化为ascii0,返回指向此内存的指针,此指针所指数据类型没有确定,需要强转。

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

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

注意:callocmalloc的基础上将空间按字节初始化为ascii0,且其参数有两个,两参数之积为空间总字节数。

 

realloc

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

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

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

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

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

 

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个字节大小)按字节赋值为ascii3,即每个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位按字节赋ascii3(每8位均为00000011),转为10进制(DEC)如下:

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页