Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
malloc和calloc_C_Memory Management_Malloc_Calloc - Fatal编程技术网

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()

我知道这个问题可能被标记为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
我知道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
实际上会将该内存归零,其中As
malloc
只会给您一个指向该内存的指针,内存中可能有也可能没有所有的零。例如,如果您获得了从另一个对象回收的内存,那么对
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