有人能解释一下在C语言中使用
malloc()
和calloc()
进行动态内存分配的区别吗?malloc()
和calloc()
进行动态内存分配的区别吗?char* pszKuchBhi ;
pszKuchBhi = malloc(10) ;
printf( "%s\n", pszKuchBhi ) ;
// Will give some junk values as the memory allocated is not initialized and
// was storing some garbage values
现在,将malloc替换为calloc并进行相同的操作。看看有什么不同之处。
char* pszKuchBhi ;
pszKuchBhi = calloc( 10, 1 ) ;
printf( "%s\n", pszKuchBhi ) ;
//Will print nothing as the memory is initialized to 0
calloc分配的内存会被初始化为0。 对于初学者来说,初始化内存是很好的,但从性能角度来看,calloc速度较慢,因为它必须分配然后初始化。 为了更好地解释,你可以随时通过谷歌搜索同样的问题,但最好自己体验一下,看一看内部情况。你也可以注意你的内存,以便亲眼看到。
分配100字节的内存,其初始化为0。
char *ptr = calloc(100, sizeof(char));
char *ptr = malloc(100);
int i = 0;
for(i=0; i< 100; i++)
ptr[i] = 0;
在分配内存后,如果需要初始化,最好使用malloc()
。没有必要将其初始化为0,然后再用数据进行初始化。
int *var;
var = malloc(100 * sizeof(int));
// OR
var = calloc(100, sizeof(int));
malloc
需要一个字节数参数,而calloc
需要一个元素数量和元素大小作为参数,它会自行计算总共需要的空间,并将分配的内存全部填充为零。一个是原始的(malloc()
),另一个更像是方便函数(calloc()
)。本质上,你可以将calloc()
想象成这样实现:
void * my_calloc(size_t num_elems, size_t elem_size)
{
const size_t bytes = num_elems * elem_size;
void *p;
if((p = malloc(bytes)) != NULL)
{
memset(p, 0, bytes);
}
return p;
}
malloc
返回一个固定字节数的分配。这个内存没有被清除(垃圾值)。
calloc
返回一个特定内存对象数量的分配。这个内存被清零。