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
的变量占用的内存大小。
文中犯了一个常见的错误,就是将指针与它指向的内存混为一谈。这是两件不同的事情。如果指针指向已分配的块,则该块不会分配给该指针。 (块的内容也没有存储在指针中——另一个常见错误)。
分配本身存在,指针变量存在于别处,指针变量指向分配。指针变量可以更改为指向别处而不会干扰分配。
我读到:
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
的变量占用的内存大小。
文中犯了一个常见的错误,就是将指针与它指向的内存混为一谈。这是两件不同的事情。如果指针指向已分配的块,则该块不会分配给该指针。 (块的内容也没有存储在指针中——另一个常见错误)。
分配本身存在,指针变量存在于别处,指针变量指向分配。指针变量可以更改为指向别处而不会干扰分配。