为什么在 malloc() 的参数中使用 sizeof()?

gig*_*ure 0 c memory

就像这本书向我展示的那样 int *list = malloc(3 * sizeof(int))

但这有什么问题呢? int *list = malloc(3)

我的理解是 malloc 接受“size”作为参数,而我的目标是只让指针list接受其中的 3 个值,但是为什么我sizeof(int)在使用 malloc 时要包含它呢?

小智 7

我们来看这行代码:

int *list = malloc(3 * sizeof(int))
Run Code Online (Sandbox Code Playgroud)

它创建一个指向 an 的指针int,并为其分配三倍于 int 大小的内存。int所以我们有足够的空间在该内存块中存储三个。

我假设一个 int 占用四个字节的内存。因此,要存储其中的三个,我们需要 12 个字节的内存(每个 int 四个字节乘以 3 个ints)。malloc以字节为单位分配空间,因此将为您提供 12 个字节的内存(sizeof(int)将返回 4,因为每个 int* 有 4 个字节)。

现在让我们看看另一个版本:

int *list = malloc(3)
Run Code Online (Sandbox Code Playgroud)

您分配三个字节的内存。遗憾的是,1 个 int 是 4 个字节...因此您有足够的空间容纳 3/4 个 int(再次假设 1 个 int 是 4 个字节)。如果你想存储三个 int,无论 int 有多大,你都需要分配三倍的内存,因此3 * sizeof(int)


*从技术上讲,有些平台的 anint不是四个字节。所以最好是写sizeof(int)而不是4. 不过,现在不用担心。

  • 关于“*有些平台上的 int 不是四个字节。*”,事实上,它可以是 1、2、4、8,任何东西。只要它可以存储 -32,767..32,767,并且只要它至少与“short”一样大。 (2认同)