确定在堆中分配的缓冲区的大小
Determine the size of buffer allocated in heap
我想知道在 byte
中使用 calloc
分配的缓冲区的大小。通过在我的机器上测试以下内容:
double *buf = (double *) calloc(5, sizeof(double));
printf("%zu \n", sizeof(buf));
结果是 8,即使我只更改一个元素,我仍然得到 8。我的问题是:
- 这是否意味着我只能乘以 8*5 才能得到以字节为单位的缓冲区大小? (我以为
sizeof
会 return 40)。
- 如何制作一个 return 缓冲区大小(以字节为单位)的宏(要检查的缓冲区可以是
char
、int
、double
或 float
)?
欢迎任何想法。
引用 C11
,章节 §6.5.3.4,(强调我的)
The sizeof
operator yields the size (in bytes) of its operand, which may be an
expression or the parenthesized name of a type. The size is determined from the type of
the operand. [...]
所以,使用sizeof
你不能得到指针指向的内存位置的大小。你需要自己跟踪。
具体来说,您的情况等同于 sizeof (double *)
,它基本上根据您的环境为您提供指针的大小(双倍)。
没有通用或直接的方法可以从内存分配器函数中获取已分配内存的大小。但是,您可以使用 sentinel value 来标记已分配缓冲区的结尾并使用循环,您可以检查该值,但这意味着
- 分配一个额外的元素来保存标记值本身
- 标记值必须从内存中的允许值中排除。
根据需要选择。
sizeof(buf)
是buf
变量的大小,是一个指针,不是它指向的缓冲区的大小。
由于内存对齐要求(由硬件强加),分配给 calloc()
的块的大小至少是您作为参数传递给 calloc()
的值的乘积。
在您的情况下,缓冲区的大小至少为 5 * sizeof(double)
.
Afaik 没有办法找到动态分配的内存块的大小,但只要你分配它,你就已经知道它的大小;您必须将它作为参数传递给内存分配函数(可以是 malloc()
、calloc()
、realloc()
或任何其他。
我想知道在 byte
中使用 calloc
分配的缓冲区的大小。通过在我的机器上测试以下内容:
double *buf = (double *) calloc(5, sizeof(double));
printf("%zu \n", sizeof(buf));
结果是 8,即使我只更改一个元素,我仍然得到 8。我的问题是:
- 这是否意味着我只能乘以 8*5 才能得到以字节为单位的缓冲区大小? (我以为
sizeof
会 return 40)。 - 如何制作一个 return 缓冲区大小(以字节为单位)的宏(要检查的缓冲区可以是
char
、int
、double
或float
)?
欢迎任何想法。
引用 C11
,章节 §6.5.3.4,(强调我的)
The
sizeof
operator yields the size (in bytes) of its operand, which may be an expression or the parenthesized name of a type. The size is determined from the type of the operand. [...]
所以,使用sizeof
你不能得到指针指向的内存位置的大小。你需要自己跟踪。
具体来说,您的情况等同于 sizeof (double *)
,它基本上根据您的环境为您提供指针的大小(双倍)。
没有通用或直接的方法可以从内存分配器函数中获取已分配内存的大小。但是,您可以使用 sentinel value 来标记已分配缓冲区的结尾并使用循环,您可以检查该值,但这意味着
- 分配一个额外的元素来保存标记值本身
- 标记值必须从内存中的允许值中排除。
根据需要选择。
sizeof(buf)
是buf
变量的大小,是一个指针,不是它指向的缓冲区的大小。
由于内存对齐要求(由硬件强加),分配给 calloc()
的块的大小至少是您作为参数传递给 calloc()
的值的乘积。
在您的情况下,缓冲区的大小至少为 5 * sizeof(double)
.
Afaik 没有办法找到动态分配的内存块的大小,但只要你分配它,你就已经知道它的大小;您必须将它作为参数传递给内存分配函数(可以是 malloc()
、calloc()
、realloc()
或任何其他。