C - calloc()v.malloc()

Kev*_*ith 32 c malloc calloc

可能重复:
c malloc和calloc之间的区别

请解释一下这句话的意义,

malloc()和calloc()函数之间的另一个区别是malloc()函数分配的内存包含垃圾值,而calloc()函数分配的内存包含全零.

来源('C'编程,Salim Y. Amdani)

谢谢

Edw*_*eno 39

来自http://wiki.answers.com/Q/Is_it_better_to_use_malloc_or_calloc_to_allocate_memory

malloc()更快,因为calloc()初始化分配的内存以包含全零.由于您通常希望自己使用和初始化内存,因此calloc()可能不需要这种额外的好处.

  • 根据最近的这篇文章,这不是真的.他表明,calloc大多速度更快,并且还有其他一些好处.https://vorpus.org/blog/why-does-calloc-exist/ (3认同)

dcp*_*dcp 24

calloc在使用之前初始化内存,但malloc没有.

请参考链接:

calloc()函数应为nelem元素数组分配未使用的空间,每个元素的大小(以字节为单位)为elsize.该空间应初始化为所有位0.

有了malloc,如果你想保证相同的效果,你必须调用像memset这样的东西来重置内存,例如

char* buffer = (char*)malloc(100);
memset(buffer,0,100);
Run Code Online (Sandbox Code Playgroud)

calloc为您节省额外的一步.初始化内存的意义在于,您将变量变为已知状态而非未知状态.因此,如果要检查变量(例如数组元素)的预期值,那么通过提前预先初始化变量,可以确保要检查的值不是垃圾.换句话说,您可以区分垃圾和合法值.

例如,如果你只是在变量中留下垃圾而你正在检查一些值,比如说42,那么你无法知道你的程序是否真的将值设置为42,或者这只是因为你只剩下一些垃圾了没有初始化它.

  • 想象一下,如果你被分配了一块土地.你不知道这块土地在哪里,你不知道这片土地是什么,你给的只是一个契约.这就是`malloc`有效地做的事情 - 返回一个指向内存区域的指针.现在`calloc`可能类似于'malloc`,除了理事会保证首先推翻陆地上的所有东西.花费更多的时间,因此更昂贵,但你知道你得到了什么.你选. (16认同)

pla*_*aes 8

calloc(...)基本上是malloc+ memset(如果你想0初始化内存)

ptr = malloc(sizeof(struct fubar));
memset(ptr, 0, sizeof (struct fubar)); //here we could use some different value instead of 0 whereas calloc always 0 initialises.
Run Code Online (Sandbox Code Playgroud)

当您使用malloc分配一些内存时,它的先前内容不会被清除(即未初始化).您可能会获得在计算机启动时设置的随机值,或者您可能会看到某些内存属于以前运行的程序,但在分配和程序退出后仍未清除.

calloc本身比慢,malloc因为你必须花一些时间来清除已分配内存的内容.因此,如果您只需要分配一些内存然后复制一些内容,那么您可以自由使用malloc.