确定堆中分配的缓冲区大小

时间:2017-06-12 06:13:15

标签: c pointers sizeof

我想知道在byte中使用double *buf = (double *) calloc(5, sizeof(double)); printf("%zu \n", sizeof(buf)); 分配的缓冲区的大小。通过在我的机器中测试以下内容:

sizeof

结果是8,即使我只改为一个元素,我仍然得到8.我的问题是:

  1. 这是否意味着我只能乘以8 * 5来获取字节中的缓冲区大小? (我以为char将返回40)。
  2. 如何制作一个返回缓冲区大小的宏(要检查的缓冲区可以是intdoublefloat还是Toast.makeText(getApplicationContext(), "http://localhost/moodle/webservice/rest/server.php?wstoken=0ac06623c66a3dd0e0e431f872a74710&wsfunction=core_user_create_users", Toast.LENGTH_LONG).show(); )?
  3. 任何想法都表示赞赏。

2 个答案:

答案 0 :(得分:6)

引用C11,章节§6.5.3.4,(强调我的

  

sizeof运算符产生其操作数的大小(以字节为单位),可以是   表达式或类型的括号名称。 大小取决于类型   操作数。 [...]

因此,使用sizeof无法获得指针指向的内存位置的大小。你需要自己跟踪。

详细说明,你的情况相当于sizeof (double *),它基本上根据你的环境给你一个指针的大小(加倍)。

没有通用或直接的方法从内存分配器函数获取已分配内存的大小。但是,您可以使用 sentinel value 标记已分配缓冲区的结尾并使用循环,您可以检查该值,但这意味着

  • 分配额外元素以保存sentinel值本身
  • 必须从内存中的允许值中排除sentinel值。

根据您的需要选择。

答案 1 :(得分:2)

sizeof(buf)buf变量的大小,它是一个指针,而不是它指向的缓冲区的大小。

由于内存对齐要求(由硬件强加),使用calloc()分配的块的大小至少是您传递给calloc()作为参数的值的乘积。
在您的情况下,缓冲区的大小至少为5 * sizeof(double)

Afaik无法找到动态分配的内存块的大小,但只要你分配它,你就已经知道了它的大小;你必须将它作为参数传递给内存分配函数(无论是malloc()calloc()realloc()还是其他任何函数。