分配(calloc)和马洛克(malloc)的区别

当使用calloc分配内存块时,分配的区域被初始化为零。相反,malloc不触及分配的内存块的内容,这意味着它包含垃圾值。这可能是一个潜在的安全风险,因为内存的内容是不可预测的,编程错误可能导致这些内容的泄漏。...

当使用calloc分配内存块时,分配的区域被初始化为零。相反,malloc不触及分配的内存块的内容,这意味着它包含垃圾值。这可能是一个潜在的安全风险,因为内存的内容是不可预测的,编程错误可能导致这些内容的泄漏。

对比图

calloc与malloc对比图
分配 马洛克
功能 分配一个足够大的内存区域,以容纳每个“大小”字节的“N个元素”。还将内存的内容初始化为零。 分配“大小”字节的内存。
参数个数 2. 1.
语法 无效*calloc(块的个数,每个块的大小,字节); 无效*malloc(大小以字节为单位);
分配内存的内容 分配的区域被初始化为零。 分配内存的内容不会更改。我例如,内存包含不可预测或垃圾值。这是一种风险。
返回值 无效指针(空*)如果分配成功,则返回指向内存块的指针。如果内存分配失败,则返回空指针。 无效指针(空*)如果分配成功,则返回指向内存块的指针。如果内存分配失败,则返回空指针。

语法和示例

malloc()

void *malloc(size_t );

分配大小字节的内存。如果分配成功,则返回指向已分配内存的指针。否则返回NULL。例子:

/* Allocate memory for an array with 15 elements of type int. */ int *ptr = malloc(15 * sizeof (int)); if (ptr == NULL) { /* Memory could not be allocated, so print an error and exit. */ fprintf(stderr, "Couldn't allocate memory\n"); exit(EXIT_FAILURE); } /* Allocation succeeded. */

注意,malloc要求我们计算所需的内存字节,并将其作为参数传递给malloc。

calloc()

void *calloc(size_t , size_t );

分配一个连续的内存块,其大小足以容纳每个字节大小的元素。分配的区域被初始化为零。在上述示例中:

/* Allocate space for an array with 15 elements of type int and initialize to zeroes. */ int *ptr = calloc(15,sizeof (int)); if (ptr == NULL) { /* Memory could not be allocated, so print an error and exit. */ fprintf(stderr, "Couldn't allocate memory\n"); exit(EXIT_FAILURE); } /* Allocation succeeded. */

calloc(m,n)与

p = malloc(m * n); if(p) memset(p, 0, m * n);

解释calloc、malloc和realloc的视频

本视频教程介绍内存分配函数malloc、calloc和realloc,以及内存取消分配函数free:

安全注意事项

使用calloc而不是malloc通常是一个好主意。使用malloc时,分配内存的内容是不可预测的。编程错误可能会导致这些内存内容以意外但极易受攻击的方式泄漏。OpenSSL中的Heartbleed漏洞就是此类漏洞的一个很好的例子,其基本机制在XKCD漫画中进行了解释,更多的技术细节在本文中有介绍。

执行速度

calloc比malloc慢一点点,因为初始化分配的内存区域需要额外的步骤。然而,在实践中,速度的差别非常小,可以忽略不计。

参考文献

  • calloc手册页
  • malloc手册页

  • 发表于 2021-07-03 22:39
  • 阅读 ( 227 )
  • 分类:IT

你可能感兴趣的文章

投资回报率(roic)和洛克(roce)的区别

...回报率(roic)? 投资回报率(ROIC)是一种评估公司将资本分配到盈利投资的能力的指标。换言之,这表明企业如何利用资金创造收入。ROIC计算如下。 ROIC=(净收入-股息)/使用的资本 净收入-财政年度总收益 股息——从利润中支...

  • 发布于 2020-10-10 08:57
  • 阅读 ( 387 )

静止的(static)和动态内存分配(dynamic memory allocation)的区别

关键区别–静态内存分配与动态内存分配 在编程中,有必要存储计算数据。这些数据存储在存储器中。在计算机程序设计中用来存储数据的存储器被称为变量。变量具有特定的数据类型。因此,分配内存来运行程序。内存可...

  • 发布于 2020-10-11 12:09
  • 阅读 ( 1009 )

c(c)和目标c(objective c)的区别

...指示编译器包含头文件“stdio.h”。 C有指针。动态内存分配是一个基本概念。指针是存储另一个变量地址的变量。与C或Java等编程语言不同,C没有自动垃圾回收器。因此,程序员应该自己进行动态内存分配。动态内存管理的&...

  • 发布于 2020-10-16 06:52
  • 阅读 ( 259 )

python(python)和c语言(c language)的区别

...系统和网络驱动程序。 在C语言中,程序员的任务是自己分配内存。C有calloc()、malloc()等函数用于动态内存分配。通常,一旦程序完成执行,操作系统就会释放分配的内存。使用free()函数释放分配的内存是一个很好的C编...

  • 发布于 2020-10-24 05:03
  • 阅读 ( 305 )

斑马(zebra)和马(horse)的区别

斑马vs马 马的科学名称是马科蕨类。它是一种有蹄哺乳动物,是现存的七种马科的亚种。在过去的4500至5500万年里,马已经从一种小的多趾动物发展成一种大的单足动物。驯养马大约始于公元前4000年。 “斑马”一词来源于古老...

  • 发布于 2021-06-22 13:56
  • 阅读 ( 361 )

小马(pony)和马(horse)的区别

小马vs马 区分小马和马是很容易的。马与小马的主要区别在于身高。小马比马矮。当小马的高度达到14.2手(通常用手来确定马和小马的高度)时,马的高度超过14.2手,大部分是15.2手。 这不仅是因为小马和马的身高不同,而且...

  • 发布于 2021-06-23 18:11
  • 阅读 ( 421 )

马洛克(malloc)和新的(new)的区别

...在于计算机语言领域,经常被计算机程序员用于动态内存分配。 两者之间的基本区别是,C语言中存在Maloc,而新是C++语言的一个特定特征。Malloc也是一个函数(对于程序员来说,它需要一些时间来执行),而new是一个操作符程...

  • 发布于 2021-06-23 19:10
  • 阅读 ( 195 )

消沉(doldrums)和马纬度(horse latitudes)的区别

萧条与马的纬度 低谷和马纬度是地球上的海洋区域。具体来说,低谷是赤道附近的海洋带。该地区的特点是几乎没有风。在过去的几个世纪里,这种无风一直是海洋勘探中的一个问题,因为如果没有风,船只就不能移动。 在...

  • 发布于 2021-06-24 06:40
  • 阅读 ( 278 )

C(c)和嵌入式c(embedded c)的区别

...的任务。此外,当用C语言编写程序时,程序员必须自己分配内存。有这样的函数,malloc等,动态分配内存。他可以使用这些函数和指针来执行动态内存分配。 什么是嵌入式c(embedded c)? 嵌入式系统是一种能够执行一个或多个功...

  • 发布于 2021-07-01 09:27
  • 阅读 ( 282 )

C(c)和C++(c++)的区别

...E、catch、最后块)。 动态内存管理 C使用calloc、malloc函数分配内存,使用free函数释放内存。C++使用新的操作符分配内存和删除操作符来释放内存。所以,这是C和C++的另一个区别。 默认头文件 C的默认头文件是STDIO.H文件,而默认...

  • 发布于 2021-07-01 12:20
  • 阅读 ( 236 )
Q8572778
Q8572778

0 篇文章

相关推荐