2012-09-19 39 views
9

calloc分配存储器num块,每个块大小size的:由malloc和calloc分配的内存块布局差异?

void * calloc (size_t num, size_t size);

在存储器 分配空间数组分配存储块为NUM元件的阵列,其中每一个的大小的字节长,并将其所有位初始化为零。

相反,malloc分配的大小size的存储器的一个块:

void * malloc (size_t size);

分配内存块 分配一个的存储器大小字节的块,返回一个指针,指向块的开始。


有两个(除非是由calloc零初始化)有什么区别?

什么释放calloc表示正好通过的存储器num块作为在实践中,返回的内存区域是连续为好。

我相信,必须有一定的差异,否则就没有太大的意义来定义两个不同的接口,这些方法呢?

+0

是的,这就是为什么我甚至没有尝试认为内存不连续。那么这是否意味着术语,n块记忆是错误的? –

+0

@AvantikaSk是的,这是误导。 – nos

+1

实际上,calloc分配一个适合存储大小为n的元素数组的内存块。在大多数实现中,calloc调用malloc,然后清零内存。我认为他们有两个不同的原型偶然,他们是不同的,因为calloc归零内存。 –

回答

1

实际上他们做同样的事情。 calloc的优势在于,在执行乘法以确定需要多少内存时,好的实现将执行溢出检测。

如果你做这样的事情:

void * 
calloc(size_t nmemb, size_t size) 
{ 
    size_t sz = nmemb * size; 
    void *res = malloc(sz); 

“SZ”可能不会最终被你希望它是什么。然后,malloc将分配比呼叫者预期的少得多的分配,但呼叫者最终可能会将返回的区域视为足够大。这导致堆溢出将通常具有的所有安全影响。阵列的大小和单个细胞的尺寸:

0

唯一真正的区别是0与calloc()初始化。

为什么calloc()适用于块大小和块数,而malloc()不适用,我从来没有清楚过。

+0

这个答案是什么?无论OP在Q中提到的答案如何。 –

+1

@Als它回答“除了形成calloc的”0“初始化内存,这些内存如何不同?”与“唯一的真正区别是用'calloc()'。'进行0初始化,确认没有其他区别。 – glglgl

4

对不起,使用数组,在这里有在手两个不同的值中使用时无显着差异(但存储器归零)

释放calloc()可以是有用的。返回的区域内存在两种情况下连续的,他们可能使用相同的数据结构,用于跟踪这样的面积(但这是依赖于实现)

+0

如果我使用calloc(4,1),我可以在一个实例中为所有4个字节赋值吗? like:char * ptr =(char *)calloc(4,1); * ptr = <一些会填满所有4个字节的值> 这样做是否可能并且安全? –

+0

如果返回的指针不为空,它是否可能并且安全:您保证分配的区域至少有4个字节。请记住:永远不会投射calloc/malloc的返回值(在C中)。 – Jack

+0

另外:如果你想分配一个值给分配的区域,不要使用比malloc慢的calloc(由于初始化)。只有在确实需要零初始化时才使用calloc – Jack

0

他们都是一模一样的。 Calloc希望您指定要分配给定大小的块的数量,因为它将它们初始化为0.底层结构完全相同。

0

你能想到的calloc()为相当多:

void* calloc(size_t nmemb, size_t size) 
{ 
    const size_t nbytes = nmemb * size; 
    void *p = malloc(nbytes); 
    if(p != NULL) 
    memset(p, 0, nbytes); 
    return p; 
} 

注意可能会有完全不同的实现,但它上面的功能等价物。内存的“内部布局”没有区别,你会得到一个连续的块。

1

我试图找出如何calloc工作

我发现下面的代码

/* We use this function occasionally since the real implementation may 
    be optimized when it can assume the memory it returns already is 
    set to NUL. */ 
void * weak_function 
calloc (size_t nmemb, size_t size) 
{ 
    /* New memory from the trivial malloc above is always already cleared. 
    (We make sure that's true in the rare occasion it might not be, 
    by clearing memory in free, below.) */ 
    size_t bytes = nmemb * size; 

#define HALF_SIZE_T (((size_t) 1) << (8 * sizeof (size_t)/2)) 
    if (__builtin_expect ((nmemb | size) >= HALF_SIZE_T, 0) 
     && size != 0 && bytes/size != nmemb) 
    return NULL; 

    return malloc (bytes); 
} 

你可以看到有释放calloc()和malloc之间没有很大的区别。

你可以在这里brouse的glibc的代码

http://sourceware.org/git/?p=glibc.git;a=blob;f=elf/dl-minimal.c

0

是。什么Calloc()所做的就是分配的大小size_t size的每块n块各尺寸size_t size &的则为零。