首页 > 其他分享 >malloc()与calloc区别

malloc()与calloc区别

时间:2022-12-26 10:48:28浏览次数:60  
标签:malloc 区别 int char calloc sizeof size

1.分配内存空间函数malloc
  调用形式: (类型说明符*) malloc (size) 功能:在内存的动态存储区中分配一块长度为"size" 字节的连续区域。函数的返回值为该区域的首地址。 “类型说明符”表示把该区域用于何种数据类型。(类型说明符*)表示把返回值强制转换为该类型指针。“size”是一个无符号数。例如: pc=(char *) malloc (100); 表示分配100个字节的内存空间,并强制转换为字符数组类型, 函数的返回值为指向该字符数组的指针, 把该指针赋予指针变量pc。
2.分配内存空间函数 calloc
  calloc 也用于分配内存空间。调用形式: (类型说明符*)calloc(n,size) 功能:在内存动态存储区中分配n块长度为“size”字节的连续区域。函数的返回值为该区域的首地址。(类型说明符*)用于强制类型转换。calloc函数与malloc 函数的区别仅在于一次可以分配n块区域。例如: ps=(struet stu*) calloc(2,sizeof (struct stu)); 其中的sizeof(struct stu)是求stu的结构长度。因此该语句的意思是:按stu的长度分配2块连续区域,强制转换为stu类型,并把其首地址赋予指针变量ps。

 

简单的说是:

 

malloc它允许从空间内存池中分配内存,malloc()的参数是一个指定所需字节数的整数. 例如:P=(int*)malloc(n*sizeof(int));   colloc与malloc类似,但是主要的区别是存储在已分配的内存空间中的值默认为0,使用malloc时,已分配的内存中可以是任意的值.   colloc需要两个参数,第一个是需要分配内存的变量的个数,第二个是每个变量的大小. 例如:P=(int*)colloc(n,colloc(int));

 

另一个版本:

 

函数原型不同: void *malloc(unsigned size)//动态申请size个字节的内存空间;功能:在内存的动态存储区中分配一块长度为" size" 字节的连续区域。函数的返回值为该区域的首地址。。(类型说明符*)表示把返回值强制转换为该类型指针。

(void *)calloc(unsigned n,unsigned size)//      用于向系统动态申请n个, 每个占size个字节的内存空间; 并把分配的内存全都初始化为零值。函数的返回值为该区域的首地址

(void *)realloc(void *p,unsigned size)//将指针p所指向的已分配内存区的大小改为size

区别:两者都是动态分配内存。主要的不同是malloc不初始化分配的内存,已分配的内存中可以是任意的值. calloc 初始化已分配的内存为0。次要的不同是calloc返回的是一个数组,而malloc返回的是一个对象。

malloc它允许从空间内存池中分配内存,          malloc()的参数是一个指定所需字节数的整数. 例如:P=(int*)malloc(n*sizeof(int));

colloc与malloc类似,    colloc需要两个参数,第一个是需要分配内存的变量的个数, 第二个是每个变量的大小. 例如:P=(int*)colloc(n,sizeof(int));
例,申请一个字符大小的指针 char *p=(char *)malloc(sizeof(char)); //当然单个是没有什么意义的申请动态数组或一个结构,如
char *str=(char *)malloc(sizeof(char)*100); //相当于静态字符数组str[100],但大小可以更改的
typedef struct pointer { int data; struct pointer *p; } pp;
pp *p=(pp *)malloc(sizeof(struct pointer)); //动态申请结构体空间
其他几个函数是队申请空间的修改的操作根据定义自己可以试试

 

 

再一个版本:

http://nuomi1988.blog.hexun.com/35121805_d.html

一:它们都是动态分配内存,先看看它们的原型:

void *malloc( size_t size ); //分配的大小

void *calloc( size_t numElements, size_t sizeOfElement ); // 分配元素的个数和每个元素的大小

共同点就是:它们返回的是 void * 类型,也就是说如果我们要为int或者其他类型的数据分配空间必须显式强制转换;

不同点是:用malloc分配存储空间时,必须由我们计算需要的字节数。如果想要分配5个int型的空间,那就是说需要5*sizeof(int)的内存空间:

int * ip_a; ip_a = (int*)malloc( sizeof (int) * 5 );

而用calloc就不需要这么计算了,直接:

ip_a = ( int* )calloc( 5, sizeof(int) );这样,就分配了相应的空间,而他们之间最大的区别就是:用malloc只分配空间不初始化,也就是依然保留着这段内存里的数据,而calloc则进行了初始化,calloc分配的空间全部初始化为0,这样就避免了可能的一些数据错误。

先写段代码体验体验....

#include <iostream>

using namespace std;

void main() { int * ip_a; int * ip_b;

ip_a = (int*)malloc( sizeof (int) * 5 ); for( int i = 0; i < 5; i++ ) {    cin>>ip_a[i]; } for( int j = 0; j < 5; j++ ) {    cout<<ip_a[j]<<" "; }

ip_b = ( int* )calloc( 5, sizeof(int) ); for( int j = 0; j < 5; j++ ) {    cout<<ip_b[j]<<" "; }

}

这个输出就能够清晰的看出他们的不同....

 

 

++版:

三个函数的申明分别是: void* realloc(void* ptr, unsigned newsize); void* malloc(unsigned size); void* calloc(size_t numElements, size_t sizeOfElement); 都在stdlib.h函数库内

它们的返回值都是请求系统分配的地址,如果请求失败就返回NULL

malloc用于申请一段新的地址,参数size为需要内存空间的长度,如: char* p; p=(char*)malloc(20);

calloc与malloc相似,参数sizeOfElement为申请地址的单位元素长度,numElements为元素个数,如: char* p; p=(char*)calloc(20,sizeof(char)); 这个例子与上一个效果相同

realloc是给一个已经分配了地址的指针重新分配空间,参数ptr为原有的空间地址,newsize是重新申请的地址长度 如: char* p; p=(char*)malloc(sizeof(char)*20); p=(char*)realloc(p,sizeof(char)*40);

注意,这里的空间长度都是以字节为单位。

C语言的标准内存分配函数:malloc,calloc,realloc,free等。 malloc与calloc的区别为1块与n块的区别: malloc调用形式为(类型*)malloc(size):在内存的动态存储区中分配一块长度为“size”字节的连续区域,返回该区域的首地址。 calloc调用形式为(类型*)calloc(n,size):在内存的动态存储区中分配n块长度为“size”字节的连续区域,返回首地址。 realloc调用形式为(类型*)realloc(*ptr,size):将ptr内存大小增大到size。 free的调用形式为free(void*ptr):释放ptr所指向的一块内存空间。 C++中为new/delete函数。

标签:malloc,区别,int,char,calloc,sizeof,size
From: https://www.cnblogs.com/kn-zheng/p/17005166.html

相关文章

  • List与Set的区别
    List、Set都继承自Collection接口;List的特点:元素有放入顺序,且可重复;Set的特点:元素无放入顺序,且不可重复(注意:元素虽然无放入顺序,但是元素在Set中的位置是由该元素的HashC......
  • 堆和栈的区别
       申请方式栈(stack)是由系统自动分配的。例如,声明函数中一个局部变量“intb;”,那么系统自动在栈中为b开辟空间。堆(heap)需要程序员自己申请,并在申请时指定大小。......
  • Squarespace 和 WordPress 的区别
    博主前些天发现了一个巨牛巨好用的刷题网站,忍不住分享一下给大家,......
  • 面试官:你说说 Vue 中的组件和插件有什么区别?
    大家好,我是CoderBin前言面试官:“你说说Vue中的组件和插件有什么区别?”紧张的萌新:“vue组件是封装可复用的UI结构,插件好像是用vue.use()...”面试官:“...”······......
  • jenkins中使用Pipeline script 和Pipeline script from SCM的区别
    PipelinescriptfromSCMPipelinescriptfromSCM是从git上拉取Dockerfile,使用Dockerfile中的script去执行,但是要注意的是,当Dockerfile和代码在一个repo的时候,拉取Docke......
  • 秒懂“一键登录”与“短信验证码登录”的区别
    众所周知,新下载一个APP,首先需要做的事情就是注册和登录。目前,市场上主流的两种注册登录方式是“一键登录”与“短信验证码登录”,那么这两种方式有什么异同呢?早在几年前,用户......
  • numpy中...和:的区别
    ...代指多个:,:。importnumpyasnpw1=[]forjinrange(5):  ifj!=0:    w1.append((j*1,j*1+1,0))w1=np.array(w1)#print(w1)#print(w1[:,:-1])e......
  • 前端知识学习案例-Bom和dom得区别
        ......
  • http1.0、http1.1和http2.0的区别
    今天面试被问到http1.0、1.1、2.0的区别,我是一点都不知道,只知道https和htpp的区别,没办法,只能学一下然后记录一下http1.0说到常用的http,我们知道浏览器与服务器只保存短暂......
  • 设计模式之美--结构型设计模式的区别
    结构型设计模式:主要总结一些类和对象组合在一起的经典结构,这些经典结构去解决特定应用场景的问题。代理模式:用来给原始类附加不想关的其他功能;装饰器模式:适配器模式:桥......