sizeof returns 分配的内存量是多少?

Does sizeof returns the amount of memory allocated?

我读到:

sizeof operator returns the size of the data type, not the amount of memory allocated to the variable.

分配的内存量不取决于数据类型的大小吗?我的意思是,当我将 int 传递给它时,sizeof 将 return 4 (architecture-dependent)。

我是不是漏掉了什么?

"内存分配" 在 C 中通常是指显式分配(即:在堆上 - malloc() 和朋友)或隐式分配(即:在堆栈)。

如您所定义,sizeof() returns 数据类型的大小:

  • sizeof(char) - 单个 char
  • sizeof(void *) - void 指针

如果您调用 malloc(sizeof(int)),您正在请求“足够的内存来保存 int 的数据”,这可能是 4 个字节您的系统...您可能会发现分配的内存比您请求的多(尽管这通常对您隐藏,请参阅 canaries)。

此外,如果您调用 int *x = malloc(1024)sizeof(*x),您可能会得到 4,因为 int 恰好是 4 个字节...即使您分配的内存为 1 KiB。如果您错误地调用了 sizeof(x),那么您将得到一个指针的大小 returned,而不是它指向的类型的大小。这些(sizeof(*x)sizeof(x))都不会 return 1024.

sizeof returns字节数

The sizeof operator yields the size (in bytes) of its operand, which may be an expression or the parenthesized name of a type.

但是不能保证每个字节的大小都是8,所以不能直接获取分配的内存量。

A byte is composed of a contiguous sequence of bits, the number of which is implementation-defined

无论如何你可以使用CHAR_BIT常量推断出分配的内存量,其中包含的位数是一个字节。

sizeof returns变量或堆栈分配数组占用的字节数。

示例:

  • sizeof(char)=1(在大多数配置中)
  • 但是sizeof(char*)=8(取决于平台)
  • 如果您使用 malloc 动态分配内存,您将收到一个指向该内存块的指针。如果在上面使用sizeof,你将得到指针的大小。
  • 然而,sizeof()一个堆栈分配的数组,就像你写的int a[10]是分配内存的大小(所以4*10)

指针的大小不依赖于它所代表的数据类型的大小。 (在32位平台上,一个指针是32位的)

您引用的文字在技术上不正确。 sizeof variable_name return 调用 variable_name 的变量占用的内存大小。

文中犯了一个常见的错误,就是将指针与它指向的内存混为一谈。这是两件不同的事情。如果指针指向已分配的块,则该块不会分配给该指针。 (块的内容也没有存储在指针中——另一个常见错误)。

分配本身存在,指针变量存在于别处,指针变量指向分配。指针变量可以更改为指向别处而不会干扰分配。