malloc和calloc
我知道这个问题可能被标记为malloc和calloc之间差异的重复,但我仍然想问它malloc和calloc,c,memory-management,malloc,calloc,C,Memory Management,Malloc,Calloc,我知道这个问题可能被标记为malloc和calloc之间差异的重复,但我仍然想问它 void *malloc(size_t size); // syntex for malloc() function void *calloc(size_t num, size_t size); // syntex for calloc() function // example ptr = malloc(num*size); // for malloc()
void *malloc(size_t size); // syntex for malloc() function
void *calloc(size_t num, size_t size); // syntex for calloc() function
// example
ptr = malloc(num*size); // for malloc() function
ptr = calloc(num,size); // for calloc() function
我知道calloc初始化内存块,这里我的问题不是集中在这一部分
void *malloc(size_t size); // syntex for malloc() function
void *calloc(size_t num, size_t size); // syntex for calloc() function
// example
ptr = malloc(num*size); // for malloc() function
ptr = calloc(num,size); // for calloc() function
我的问题是
void *malloc(size_t size); // syntex for malloc() function
void *calloc(size_t num, size_t size); // syntex for calloc() function
// example
ptr = malloc(num*size); // for malloc() function
ptr = calloc(num,size); // for calloc() function
malloc的定义说它分配指定大小的内存块
void *malloc(size_t size); // syntex for malloc() function
void *calloc(size_t num, size_t size); // syntex for calloc() function
// example
ptr = malloc(num*size); // for malloc() function
ptr = calloc(num,size); // for calloc() function
calloc说它分配了多个相同大小的内存块
void *malloc(size_t size); // syntex for malloc() function
void *calloc(size_t num, size_t size); // syntex for calloc() function
// example
ptr = malloc(num*size); // for malloc() function
ptr = calloc(num,size); // for calloc() function
一块内存和多块内存的分配是两者之间的真正区别吗
void *malloc(size_t size); // syntex for malloc() function
void *calloc(size_t num, size_t size); // syntex for calloc() function
// example
ptr = malloc(num*size); // for malloc() function
ptr = calloc(num,size); // for calloc() function
因为我觉得我们可以使用malloc做同样的事情,这可以由calloc完成
void *malloc(size_t size); // syntex for malloc() function
void *calloc(size_t num, size_t size); // syntex for calloc() function
// example
ptr = malloc(num*size); // for malloc() function
ptr = calloc(num,size); // for calloc() function
例如:
int *ptr;
ptr=(int *) malloc(100 * (sizeof(int)));
void *malloc(size_t size); // syntex for malloc() function
void *calloc(size_t num, size_t size); // syntex for calloc() function
// example
ptr = malloc(num*size); // for malloc() function
ptr = calloc(num,size); // for calloc() function
及
void *malloc(size_t size); // syntex for malloc() function
void *calloc(size_t num, size_t size); // syntex for calloc() function
// example
ptr = malloc(num*size); // for malloc() function
ptr = calloc(num,size); // for calloc() function
最后会分配100倍于int所需的内存。Well
calloc
也会初始化内存块以包含零,而不像malloc
calloc
用零填充内存
p=calloc(n, m);
void *malloc(size_t size); // syntex for malloc() function
void *calloc(size_t num, size_t size); // syntex for calloc() function
// example
ptr = malloc(num*size); // for malloc() function
ptr = calloc(num,size); // for calloc() function
相当于
p=malloc(n*m);
memset(p, 0, m * n);
void *malloc(size_t size); // syntex for malloc() function
void *calloc(size_t num, size_t size); // syntex for calloc() function
// example
ptr = malloc(num*size); // for malloc() function
ptr = calloc(num,size); // for calloc() function
因此,如果您打算将分配的内存设置为零,那么使用malloc
您必须计算n*m
两次,或者使用temp变量,这就是calloc
所做的
void *malloc(size_t size); // syntex for malloc() function
void *calloc(size_t num, size_t size); // syntex for calloc() function
// example
ptr = malloc(num*size); // for malloc() function
ptr = calloc(num,size); // for calloc() function
编辑:我刚刚阅读了ISO C标准,发现没有规定
calloc
的实现应该检查n*m
是否溢出,也就是说,它是否超过C99标准中的常量SIZE\u MAX
。您的代码示例是正确的。。。ptr
指向的实际内存将是相同的大小(即,100个int
对象堆上的数组)。但是,正如其他人所提到的,调用calloc
实际上会将该内存归零,其中Asmalloc
只会给您一个指向该内存的指针,内存中可能有也可能没有所有的零。例如,如果您获得了从另一个对象回收的内存,那么对malloc
的调用仍将具有以前使用的值。因此,如果您将内存视为“干净”,而不使用某些默认值对其进行初始化,那么您的程序最终将出现某种类型的意外行为。是的,主要区别如上所述。
void *malloc(size_t size); // syntex for malloc() function
void *calloc(size_t num, size_t size); // syntex for calloc() function
// example
ptr = malloc(num*size); // for malloc() function
ptr = calloc(num,size); // for calloc() function
另外,从操作系统内存分配的角度来看,calloc()比malloc()慢
void *malloc(size_t size); // syntex for malloc() function
void *calloc(size_t num, size_t size); // syntex for calloc() function
// example
ptr = malloc(num*size); // for malloc() function
ptr = calloc(num,size); // for calloc() function
malloc()返回指针在程序接触malloc()之前不会接触实际内存。而calloc()返回的是带有RAM的内存 这一点在本网站上已经提到过,但从其他答案来看,我认为值得重复;两个整数相乘可能会导致溢出,如果发生这种情况
ptr = malloc(num*size);
void *malloc(size_t size); // syntex for malloc() function
void *calloc(size_t num, size_t size); // syntex for calloc() function
// example
ptr = malloc(num*size); // for malloc() function
ptr = calloc(num,size); // for calloc() function
可能不会产生所需的结果(并且很可能导致以后的分段错误)。对于这些情况,
calloc(num,size)
应该是首选(尽管您也可以在调用malloc之前测试溢出,如果calloc()
将新分配的内存初始化为零这一事实困扰您) 两者之间的主要区别是calloc将内存块初始化为零,而malloc创建的内存块包含垃圾值。void *malloc(size_t size); // syntex for malloc() function
void *calloc(size_t num, size_t size); // syntex for calloc() function
// example
ptr = malloc(num*size); // for malloc() function
ptr = calloc(num,size); // for calloc() function
因此,更适合使用calloc而不是malloc来避免代码中的不确定性。==您可以看到mallac()和calloc()函数的以下区别===
void *malloc(size_t size); // syntex for malloc() function
void *calloc(size_t num, size_t size); // syntex for calloc() function
// example
ptr = malloc(num*size); // for malloc() function
ptr = calloc(num,size); // for calloc() function
初始化:malloc()不清除并初始化分配的内存。
calloc()将分配的内存初始化为零
void *malloc(size_t size); // syntex for malloc() function
void *calloc(size_t num, size_t size); // syntex for calloc() function
// example
ptr = malloc(num*size); // for malloc() function
ptr = calloc(num,size); // for calloc() function
Syntex:
void *malloc(size_t size); // syntex for malloc() function
void *calloc(size_t num, size_t size); // syntex for calloc() function
// example
ptr = malloc(num*size); // for malloc() function
ptr = calloc(num,size); // for calloc() function
参数:如果考虑MalCube()语法,它只需要1个参数。 如果考虑CalOrthor()语法,它将需要2个参数。
void *malloc(size_t size); // syntex for malloc() function
void *calloc(size_t num, size_t size); // syntex for calloc() function
// example
ptr = malloc(num*size); // for malloc() function
ptr = calloc(num,size); // for calloc() function
内存分配方式::函数的作用是:从可用堆中分配所需大小的内存。
calloc()函数指定的内存大小等于'num*size'。ya我知道,但我的问题是,这两者之间还有什么区别吗?@haris:好吧,你列举了主要区别,这里的答案列举了你遗漏的一个重要区别。所以除了这些没有区别。除了初始化为零,这两者之间没有其他区别?正如我所说的,在内存方面它们是等价的。等价性不是100%,原因有两个。首先,存在
n*m
溢出的陷阱<如果产品太大,code>calloc将失败,malloc
只需分配更少。其次,calloc
可能比malloc
+memset
快(但比malloc
慢)。首先,同意。第二,我从来没有说过相反的话@urogen:我不明白malloc(n)或任何分配器如何分配少于'n'字节??如果它不能分配请求的数量,它就应该失败:你能详细说明第二部分吗?我不认为第二部分是对的,至少在Linux/Unix/Windows这样的现代受保护内存操作系统上是不对的。。。你能进一步解释一下你的意思吗?以防我误解了什么?像Linux这样的操作系统遵循一种乐观的内存分配策略。所以,在程序使用物理内存之前,malloc返回的指针不受物理内存的支持。从硬件的角度来看,它们是两个页面,即匿名页面和文件备份页面。当我们执行malloc()时,会得到匿名页面。匿名页面可能会读取交换区域,对于calloc(),操作系统还必须通过交换其他进程来找到合适的内存区域,这会使其变慢。+1感谢您的解释,尽管您可能想更改第二段中的措辞,因为您的表述方式有点混乱。。。也许你应该明确地提到“因为操作系统级别的内存分配是乐观的,…”,等等。
void *malloc(size_t size); // syntex for malloc() function
void *calloc(size_t num, size_t size); // syntex for calloc() function
// example
ptr = malloc(num*size); // for malloc() function
ptr = calloc(num,size); // for calloc() function