可能重复:c malloc和calloc之间的区别为什么malloc memset比calloc慢?
calloc和malloc之间有什么区别,后面跟着一个memset?如果我用malloc替换所有对calloc的调用,后跟memset,它会是一样吗?
如果是这种情况,那么为什么单独提供两个函数malloc&calloc?
虽然 calloc() 始终使用零( '\0' )初始化内存区域,但 memset() 调用允许您选择填充内存的字节 .
calloc()
'\0'
memset()
就速度而言,如果需要将存储器清零, calloc() 可能会快于 malloc() memset() ; malloc() 更快地返回未初始化的内存,但仍需要额外调用 memset() .
malloc()
基本上,如果要将内存清零,请使用 calloc() ;如果你想保持未初始化状态,请使用 malloc() .
一个重要的区别是,如果 nmemb * size 溢出,我希望 calloc(nmemb, size) 返回 NULL . 如果您改为使用 malloc(nmemb * size) ,则乘法溢出会导致您请求比预期更小的缓冲区(这可能会导致以后出现安全问题) . 因此,如果您计划用 malloc 替换 calloc 次呼叫,则需要注意一些事项 .
nmemb * size
calloc(nmemb, size)
NULL
malloc(nmemb * size)
malloc
calloc
2 回答
虽然
calloc()
始终使用零('\0'
)初始化内存区域,但memset()
调用允许您选择填充内存的字节 .就速度而言,如果需要将存储器清零,
calloc()
可能会快于malloc()
memset()
;malloc()
更快地返回未初始化的内存,但仍需要额外调用memset()
.基本上,如果要将内存清零,请使用
calloc()
;如果你想保持未初始化状态,请使用malloc()
.一个重要的区别是,如果
nmemb * size
溢出,我希望calloc(nmemb, size)
返回NULL
. 如果您改为使用malloc(nmemb * size)
,则乘法溢出会导致您请求比预期更小的缓冲区(这可能会导致以后出现安全问题) . 因此,如果您计划用malloc
替换calloc
次呼叫,则需要注意一些事项 .