malloc()与calloc区别

本文详细解释了malloc和calloc的区别,包括内存分配、初始化和返回值,并提供了实例代码进行对比演示。

Both the malloc() and the calloc() functions are used to allocate dynamic memory. Each operates slightly different from the other.


Both the malloc() and the calloc() functions are used to allocate dynamic memory. Each operates slightly different from the other. malloc() takes a size and returns a pointer to a chunk of memory at least that big:
void *malloc( size_t size );
calloc() takes a number of elements, and the size of each, and returns a pointer to a chunk of memory 
at least big enough to hold them all:
void *calloc( size_t numElements, size_t sizeOfElement );
There are one major difference and one minor difference between the two functions. The major difference is that malloc() doesn't initialize the allocated memory. The first time malloc() gives you a particular chunk of memory, the memory might be full of zeros. If memory has been allocated, freed, and reallocated, it probably has whatever junk was left in it.
*****
 That means, unfortunately, that a program might run in simple cases (when memory is never reallocated) but break when used harder (and when memory is reused). 
*****
这句话说的意思看了2遍还是吃不透....
calloc() fills the allocated memory with all zero bits. That means that anything there you are going to use as a char or an int of any length, signed or unsigned, is guaranteed to be zero. Anything you are going to use as a pointer is set to all zero bits. 
That is usually a null pointer, but it is not guaranteed.Anything you are going to use as a float or double is set to all zero bits; that is a floating-point zero on some types of machines, but not on all. 
The minor difference between the two is that calloc() returns an array of objects; malloc() returns one object. Some people use calloc() to make clear that they want an array.

本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/missuever/archive/2005/11/30/540045.aspx

 

另外说明:

 

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函数。

<think>首先,用户的问题是:“我想了解函数malloccalloc区别 请问函数malloccalloc区别”。这清楚地表明用户想了解C语言中malloccalloc函数的区别。 根据系统级指令: - 所有行内数学表达式必须使用$...$格式。 - 独立公式必须使用$$...$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识。 - 回答结构清晰,帮助用户逐步解决问题,尽量保证回答真实可靠。 用户提供了两个引用: - 引用[1]:讨论了malloccalloc的动态内存分配,强调区别在于功能,需要合理分配内存、空指针检查和释放内存。 - 引用[2]:补充说calloc初始化内存为0,malloc不初始化。 用户说:“上述引用仅供参考,并不是用户真正的需求,请尽可能多的参考用户上一次的问题和你的回答。” 但在这个对话中,这是第一次交互,所以没有“上一次的问题”。用户可能指的是参考提供的引用,但根据上下文,我应该基于用户当前问题回答。 关键点:用户想知道malloccalloc区别。 我需要回忆malloccalloc的标准区别: - malloc:分配一块未初始化的内存块。 - calloc:分配一块内存并将其所有位初始化为0,同时可以指定元素数量和大小,方便数组分配。 从引用[2]中,calloc初始化内存为0,malloc不初始化。 回答结构: 1. **介绍函数**:简要说明malloccalloc是什么。 2. **主要区别**:列出核心区别点。 3. **使用场景**:建议何时使用哪个函数。 4. **示例**:提供代码示例来展示区别。 5. **注意事项**:提醒内存管理问题,如空指针检查、释放内存。 6. **生成相关问题**:在末尾添加相关问题。 确保使用中文回答。 添加引用标识:在回答中,如果引用内容,末尾添加[^1]或[^2]。但用户说引用仅供参考,所以我应该基于通用知识回答,但自然地融入引用内容。引用[1]和[2]都来自站内,我需要在相关部分添加引用标记。 例如: - 当提到calloc初始化时,添加[^2]。 - 当提到一般建议时,添加[^1]。 生成相关问题:在末尾添加“§§相关问题§§”部分,列出2-3个相关问题。 最终回答结构: - 开头解释区别。 - 详细点列出。 - 代码示例(用代码块)。 - 注意事项。 - 相关问题。 代码示例:用Python风格的代码块?用户问题涉及C语言,所以我应该用C语言代码。 系统指令示例使用了Python,但这里是C语言,所以用C代码块。 数学表达式:如果涉及数学,如内存大小计算,使用$...$或$$...$$。 例如:分配n个元素,每个大小s,calloc(n, s),malloc(n * s)。 在行内:$n \times s$。 独立公式如果复杂。 现在,脑storm区别点: 1. **初始化**:calloc初始化为0,malloc不初始化。 2. **参数**:calloc接受两个参数(元素数和元素大小),malloc接受一个参数(总字节数)。 3. **使用场景**:calloc适合数组和需要初始化,malloc更通用。 4. **性能**:calloc可能稍慢因为初始化。 5. **返回值**:两者都返回void*,需要类型转换。 注意事项:检查NULL,释放内存。 回答: - 介绍:malloccalloc是C语言动态内存分配函数。 - 区别: - malloc分配指定字节数的内存,不初始化。 - calloc分配指定数量和大小的元素,并初始化为0。 - 示例:代码展示。 - 建议:根据需求选择。 - 引用:适当时添加或[^2]。 相关问题: 1. 如何避免内存泄漏? 2. 什么是realloc函数? 3. 为什么动态内存分配可能导致碎片化? 确保自然添加引用。 最终输出: [用户可见层] 回答内容... §§相关问题§§ 1. ... 2. ... 3. ... </think> ### malloccalloc区别 在C语言中,`malloc`和`calloc`都是动态内存分配函数,用于在程序运行时从堆(heap)中分配内存。它们的主要区别在于参数形式、内存初始化和使用场景。下面我将逐步解释这些区别,并提供代码示例来辅助说明。基于标准C库的定义和常见实践,我会确保回答准确可靠[^2]。 #### 1. **核心区别** - **参数不同**: - `malloc`函数接受一个参数:需要分配的总字节数。例如,分配一个大小为$n$字节的内存块:`void* malloc(size_t size);`。 - `calloc`函数接受两个参数:元素数量和每个元素的大小。例如,分配$n$个元素,每个大小为$s$字节:`void* calloc(size_t num, size_t size);`。这相当于分配总字节数为$num \times size$的内存。 - 数学上,`calloc(n, s)`等价于分配$n \times s$字节的内存,但额外进行初始化。 - **内存初始化**: - `malloc`分配的内存是未初始化的,内容随机(可能包含垃圾值)。使用前需要手动初始化,否则可能导致未定义行为。 - `calloc`分配的内存会被自动初始化为全0(所有位设置为0),适用于需要“清零”内存的场景,如数组或结构体初始化[^2]。 - 初始化区别是核心差异:`calloc`确保内存安全,但可能稍慢于`malloc`,因为额外步骤增加了开销(时间复杂度为$O(n)$,其中$n$是字节数)。 - **返回值**: - 两者都返回指向分配内存起始地址的`void*`指针,需要强制类型转换为所需类型(如`int*`)。 - 如果分配失败,两者都返回`NULL`指针,因此必须检查返回值以避免程序崩溃。 #### 2. **使用场景建议** - 使用`malloc`: - 当不需要初始化内存,或您计划手动初始化时(例如,后续通过循环填充数据)。 - 适用于通用内存分配,如创建动态数据结构(链表、树),其中性能优先。 - 示例:分配一个整数数组,但自行赋值。 - 使用`calloc`: - 当需要内存自动初始化为0时,例如创建零初始化的数组、缓冲区或结构体,避免垃圾值导致错误。 - 特别适合安全敏感场景,如密码处理或嵌入式系统,确保无残留数据。 - 示例:分配一个元素全为0的数组,简化代码。 根据需求选择:如果初始化不重要,`malloc`更高效;如果需要保证内存“干净”,`calloc`更安全[^2]。 #### 3. **代码示例** 下面用C语言代码展示两者的区别。注意:使用后必须调用`free`释放内存,以防止内存泄漏。 ```c #include <stdio.h> #include <stdlib.h> int main() { // 使用malloc分配10个整数的内存(未初始化) int* arr_malloc = (int*)malloc(10 * sizeof(int)); if (arr_malloc == NULL) { printf("malloc分配失败\n"); return 1; } printf("malloc分配的内容(可能随机): "); for (int i = 0; i < 10; i++) { printf("%d ", arr_malloc[i]); // 输出随机值 } printf("\n"); free(arr_malloc); // 释放内存 // 使用calloc分配10个整数的内存(初始化为0) int* arr_calloc = (int*)calloc(10, sizeof(int)); if (arr_calloc == NULL) { printf("calloc分配失败\n"); return 1; } printf("calloc分配的内容(全0): "); for (int i = 0; i < 10; i++) { printf("%d ", arr_calloc[i]); // 输出0 } printf("\n"); free(arr_calloc); // 释放内存 return 0; } ``` - **输出说明**: - `malloc`版本输出随机值(如`-842150451`),因为内存未初始化。 - `calloc`版本输出全0(如`0 0 0 ...`),体现初始化优势[^2]。 #### 4. **注意事项** - **空指针检查**:分配后必须检查`if (ptr == NULL)`,处理失败情况,避免段错误。 - **内存释放**:使用`free(ptr)`释放内存,否则会导致内存泄漏。养成“分配-使用-释放”习惯[^1]。 - **大小计算**:`malloc`中,手动计算总大小(如`10 * sizeof(int)`),容易出错;`calloc`的参数形式更直观。 - **性能权衡**:`calloc`的初始化增加开销,在大型分配中可能影响性能;如果不需要初始化,优先用`malloc`。 - **跨平台一致性**:C标准保证`calloc`初始化为0,但`malloc`行为依赖系统,可能在某些环境有优化。 总之,`malloc`适用于灵活分配,`calloc`适用于安全初始化。合理选择可提升代码健壮性[^1][^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值