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

Don*_*Don 4 c pointers sizeof

我想知道使用callocin 分配的缓冲区的大小byte.通过在我的机器中测试以下内容:

double *buf = (double *) calloc(5, sizeof(double));
printf("%zu \n", sizeof(buf));
Run Code Online (Sandbox Code Playgroud)

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

  1. 这是否意味着我只能乘以8*5来获取字节中的缓冲区大小?(我以为sizeof会回归40).
  2. 如何让在字节返回缓冲区的大小的宏(要检查的缓冲区可能是char,int,double,或float)?

任何想法都表示赞赏.

Sou*_*osh 6

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

sizeof操作者产生其操作数的大小(以字节为单位),其可以是表达或类型的括号名称.大小由操作数的类型确定.[...]

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

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

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

  • 分配一个额外的元素来保存sentinel值本身
  • 必须从存储器中的允许值中排除sentinel值.

根据您的需求选择.

  • @ d33j对不起?"C11"不可见吗?这不是章节,那是C标准.:)哦,这是第6章,BTW. (2认同)