区别是什么:
ptr = malloc(MAXELEMS * sizeof(char *));
And:
ptr = calloc(MAXELEMS, sizeof(char*));
什么时候使用calloc优于malloc或反之亦然?
区别是什么:
ptr = malloc(MAXELEMS * sizeof(char *));
And:
ptr = calloc(MAXELEMS, sizeof(char*));
什么时候使用calloc优于malloc或反之亦然?
当前回答
区别1:
Malloc()通常分配内存块,它是初始化的内存段。
Calloc()分配内存块并将所有内存块初始化为0。
区别2:
如果考虑malloc()语法,它只需要1个参数。考虑下面的例子:
data_type ptr = (cast_type *)malloc( sizeof(data_type)*no_of_blocks );
例如:如果你想为int类型分配10块内存,
int *ptr = (int *) malloc(sizeof(int) * 10 );
如果考虑calloc()语法,它将接受2个参数。考虑下面的例子:
data_type ptr = (cast_type *)calloc(no_of_blocks, (sizeof(data_type)));
例如:如果你想为int类型分配10块内存,并将所有这些初始化为0,
int *ptr = (int *) calloc(10, (sizeof(int)));
相似度:
malloc()和calloc()如果没有进行类型强制转换,默认情况下都会返回void* !
其他回答
有两个不同之处。 首先,是参数的数量。Malloc()接受一个参数(以字节为单位的内存需求),而calloc()需要两个参数。 其次,malloc()不会初始化分配的内存,而calloc()会将分配的内存初始化为ZERO。
Calloc()分配一个内存区域,长度将是其参数的乘积。calloc用0填充内存,并返回指向第一个字节的指针。如果它不能找到足够的空间,它返回一个NULL指针。
语法:ptr_var = calloc(no_of_blocks, size_of_each_block); 即ptr_var = calloc(n, s);
malloc()分配REQUSTED SIZE的单个内存块,并返回指向第一个字节的指针。如果它无法找到所请求的内存量,它返回一个空指针。
语法:ptr_var = malloc(Size_in_bytes); malloc()函数有一个参数,即分配的字节数,而calloc()函数有两个参数,一个是元素的数量,另一个是为每个元素分配的字节数。另外,calloc()将分配的空间初始化为0,而malloc()不会。
分配的内存块大小没有差异。Calloc只是用物理全零位模式填充内存块。在实践中,通常假设位于用calloc分配的内存块中的对象具有初始值,就像它们是用文字0初始化的一样,即整数的值应该是0,浮点变量的值应该是0.0,指针的值应该是适当的空指针值,等等。
然而,从学究的角度来看,calloc(以及memset(…, 0,…))只能保证正确地初始化unsigned char类型的对象(使用0)。其他所有内容都不能保证被正确初始化,并且可能包含所谓的陷阱表示,这会导致未定义的行为。换句话说,对于除unsigned char以外的任何类型,前面提到的全零位模式可能表示非法值,即陷阱表示。
后来,在C99标准的一个技术更正中,为所有整数类型定义了行为(这是有意义的)。也就是说,在当前的C语言中,你只能用calloc(和memset(…, 0,…))。从C语言的角度来看,在一般情况下使用它来初始化其他任何东西都会导致未定义的行为。
在实践中,calloc工作,我们都知道:),但是否想要使用它(考虑到上面的问题)取决于你。我个人更倾向于完全避免它,而是使用malloc并执行自己的初始化。
最后,另一个重要的细节是,calloc需要在内部计算最终的块大小,通过将元素大小乘以元素数量。在执行此操作时,calloc必须监视可能的算术溢出。如果无法正确计算请求的块大小,将导致分配不成功(空指针)。同时,您的malloc版本不会尝试监视溢出。它将分配一些“不可预测”的内存数量,以防发生溢出。
区别1:
Malloc()通常分配内存块,它是初始化的内存段。
Calloc()分配内存块并将所有内存块初始化为0。
区别2:
如果考虑malloc()语法,它只需要1个参数。考虑下面的例子:
data_type ptr = (cast_type *)malloc( sizeof(data_type)*no_of_blocks );
例如:如果你想为int类型分配10块内存,
int *ptr = (int *) malloc(sizeof(int) * 10 );
如果考虑calloc()语法,它将接受2个参数。考虑下面的例子:
data_type ptr = (cast_type *)calloc(no_of_blocks, (sizeof(data_type)));
例如:如果你想为int类型分配10块内存,并将所有这些初始化为0,
int *ptr = (int *) calloc(10, (sizeof(int)));
相似度:
malloc()和calloc()如果没有进行类型强制转换,默认情况下都会返回void* !
在<stdlib.h>标头中声明的calloc()函数比malloc()函数提供了几个优点。
它将内存分配为一定数量的给定大小的元素 它初始化所分配的内存,这样所有的位都是 零。
Calloc一般是malloc+memset为0
显式使用malloc+memset通常会稍微好一点,特别是当你在做以下事情时:
ptr=malloc(sizeof(Item));
memset(ptr, 0, sizeof(Item));
That is better because sizeof(Item) is know to the compiler at compile time and the compiler will in most cases replace it with the best possible instructions to zero memory. On the other hand if memset is happening in calloc, the parameter size of the allocation is not compiled in in the calloc code and real memset is often called, which would typically contain code to do byte-by-byte fill up until long boundary, than cycle to fill up memory in sizeof(long) chunks and finally byte-by-byte fill up of the remaining space. Even if the allocator is smart enough to call some aligned_memset it will still be a generic loop.
一个值得注意的例外是,当您对一个非常大的内存块(一些power__2kb)执行malloc/calloc时,在这种情况下,可以直接从内核进行分配。由于操作系统内核通常会出于安全原因将它们放弃的所有内存归零,足够聪明的calloc可能只返回内存,而不进行额外的归零。同样,如果你只是分配一些你知道很小的东西,那么在性能方面使用malloc+memset可能会更好。