malloc,calloc区别
基本概念
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(voidptr):释放ptr所指向的一块内存空间。
C++中为new/delete函数。
作用
它们都是动态分配内存,
函数调用形式
先看看它们的原型:
void *malloc( size_t size ); //分配的大小void *calloc( size_t numElements, size_t sizeOfElement ); // 分配元素的个数和每个元素的大小
异同
共同点就是:
- 都为了分配存储空间,
- 它们返回的是 void * 类型,也就是说如果我们要为int或者其他类型的数据分配空间必须显式强制转换;
不同点是:
- malloc一个形参,因此如果是数组,必须由我们计算需要的字节总数作为形参传递
用malloc只分配空间不初始化,也就是依然保留着这段内存里的数据, - calloc 2个形参 ,因此如果是数组,需要传递个数和数据类型
而calloc则进行了初始化,calloc分配的空间全部初始化为0,这样就避免了可能的一些数据错误。
eg
想要分配5个int型的空间,那就是说需要5*sizeof(int)的内存空间
int * ip_a;
ip_a = (int*)malloc( sizeof (int) * 5 );
而用calloc就不需要这么计算了,直接:
ip_a = ( int* )calloc( 5, sizeof(int) );
这样,就分配了相应的空间,
c++ test code
#include <iostream>
#include<stdlib.h>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]<<" ";//c 输出格式//printf("%d ",ip_a[j]);
}ip_b = ( int* )calloc( 5, sizeof(int) );
for( int j = 0; j < 5; j++ )
{cout<<ip_b[j]<<" ";
}}
C CODE
#include <stdio.h>
#include <stdlib.h>int main()
{int i, n;int *a;printf("要输入的元素个数:");scanf("%d",&n);a = (int*)calloc(n, sizeof(int));printf("输入 %d 个数字:\n",n);for( i=0 ; i < n ; i++ ) {scanf("%d",&a[i]);}printf("输入的数字为:");for( i=0 ; i < n ; i++ ) {printf("%d ",a[i]);}free (a); // 释放内存return(0);
}
malloc,calloc区别相关推荐
- Linux中brk()系统调用,sbrk(),mmap(),malloc(),calloc()的异同【转】
转自:http://blog.csdn.net/kobbee9/article/details/7397010 brk和sbrk主要的工作是实现虚拟内存到内存的映射.在GNUC中,内存分配是这样的: ...
- 内存分布malloc/calloc/realloc/free/new/delete、内存泄露、String模板、浅拷贝与深拷贝以及模拟string类的实现
内存分布 一.C语言中的动态内存管理方式:malloc/calloc/realloc和free 1.malloc: 从堆上获得指定字节的内存空间,函数声明:void *malloc (int n); ...
- 动态内存申请(malloc, calloc, new)之分配虚拟内存空间和物理内存空间
动态内存申请(malloc, calloc, new)之分配虚拟内存空间和物理内存空间 1. 动态内存申请的底层系统调用 动态内存申请函数根据申请的内存大小选择不同的系统调用,小于128K选择brk系 ...
- C语言动态申请内存空间之malloc(),calloc(),realloc()函数
在C语言中用于动态申请内存空间的函数主要为malloc()函数,calloc()函数,以及realloc()函数,以下主要介绍三个函数的用法,区别以及使用时的注意事项. malloc(),calloc ...
- c语言malloc,calloc,realloc函数介绍
malloc,calloc,realloc动态内存管理函数的出现解决了在某些c语言标准中不能使用变长数组的问题 这三个函数的使用需要头文件stdlib.h,这些函数开辟的空间在堆区,系统不会自动释放, ...
- C语言 malloc calloc realloc
1.malloc void *malloc(size_t size); void free(void *ptr); 2.calloc void *calloc(size_t ...
- malloc/calloc/realloc
malloc/calloc/realloc和free介绍: malloc函数 malloc函数可以从堆上获得指定字节的内存空间,其函数声明如下: void * malloc(int n); 参数释义: ...
- malloc calloc realloc 三兄弟!!!
学习过C语言的都知道 malloc calloc realloc 这三个函数,这三个函数都是用于动态的分配内存的,最后都要使用 free函数进行释放. 这三个函数的头文件 : stdlib.h 在li ...
- c语言释放内存函数,【C语言】内存分配函数malloc/ calloc/ realloc及内存释放free
前言: 内存区域划分与分配: 1.栈区(stack)--程序运行时由编译器自动分配,存放函数的参数值,局部变量的值等,程序结束时由编译器自动释放. 2.堆区(heap) -- 在内存开辟另一块存储区域 ...
- malloc calloc realloc的对比
函数原型 三个函数的声明分别是: void* realloc(void* ptr, unsigned newsize); void* malloc(unsigned size); void* call ...
最新文章
- Mobileye 自动驾驶策略(一)
- C#中Base64之编码,解码方法
- Ubuntu Docker安装
- Oracle--序列和触发器的使用
- ad19pcb所有元件都在报错_PLC的线圈输出和置复位,可以混用吗?很多人都会犯这个错误!...
- C#回调函数的简单讲解与应用例子
- 数字IC设计经典书籍
- java使用http代理访问服务器
- 点击某些按钮不要触发验证控件
- 想做产品经理,产品经理培训靠谱吗?
- 使用CyberController来将旧手机改造成电脑外挂------手机交互翻译、人脸解锁、语音识别....各个功能等你来探索
- Redis集群的节点通信原理
- Jupyter Notebook:内核似乎挂掉
- afc系统线路中心计算机系统,青岛地铁线网AFC系统建设探讨
- 特斯拉中国召回近5万辆Model S和X,美国法务:中国驾驶员使用不当-1
- POJ:3276-Face The Right Way(线性反转)
- 关于NullPointerException的小实例
- [机器学习]三行代码快速划分交叉训练中训练集和验证集
- 大数据真的很牛B吗?不不不,10分钟让你读懂它
- 【String】字符串中是否有空格(indexOf、split)