【问题标题】:malloc_usable_size() returns the wrong sizemalloc_usable_size() 返回错误的大小
【发布时间】:2017-11-18 18:06:05
【问题描述】:

我想知道 malloc 分配的大小。
我已经写了下面的源代码。

test.c

#include <stdio.h>
#include <stdint.h>
#include <malloc.h>
void main(void)
{
    uint8_t *test;

    test = (uint8_t *)malloc(sizeof(uint8_t)*4);
    printf("sizeof(test) = %d\n",malloc_usable_size(test));

    free(test); 
}  

我希望大小为 4。
但结果是 12。

sizeof(test) = 12

你能告诉我有什么问题吗?
我希望尺寸 4 正确出来。

【问题讨论】:

  • 不,malloc_usable_size() 返回正确的大小。错误的是您对正确尺寸的期望。
  • 到目前为止缺少的内容:malloc_usable_size() 用于调试,而不是用于您的主要代码。即使尺寸实际上更大,您也不应该使用它。
  • 不要将malloc_usable_size 视为确定分配大小的一种方式。出于多种原因 - 1)它不可移植。 2)您应该自己跟踪您的分配。既然你调用了 malloc,你就知道你通过了什么大小。如果您很难记住它,请做一些簿记。一种方法是在分配开始时为size_t 分配额外空间并将大小放在那里。您传递给malloc 的实际大小。其他人已经明确了为什么它返回 12 而不是 4。
  • @user2371524 “即使尺寸实际上更大,你也不应该使用它。”我喜欢函数名称 (malloc_usable_size) 的字面意思是可用大小。

标签: c memory malloc


【解决方案1】:
malloc_usable_size(test)

上述函数返回的值不是您要求的固定值。它可能大于请求的分配大小,具体取决于 cpu 字节顺序和对齐方式。这完全取决于底层实现。

【讨论】:

  • CPU 将请求的内存与类型大小或缓存行大小对齐,因此在您的情况下添加了 8 个字节
  • @Andre 我认为对齐(在这种情况下 - 它会有所不同)更有可能在 16 字节边界上。 “真正的”分配将是 16 个字节;四个将在内部使用(例如指向下一个块的指针),留下 12 个字节 [排序] 可用。
  • 是的,我想在内部管理变量所需的所有空间都已添加。因此,返回的大小因 CPU/OS 管理需求和对齐要求而异。
  • @Andre 返回的大小是可以“无不良影响”写入的可用字节数,不包括管理分配所需的字节数。 “由于对齐和最小大小限制,malloc_usable_size() 返回的值可能大于请求的分配大小。尽管应用程序可以覆盖多余的字节而不会产生不良影响,但这不是好的编程习惯:分配中的多余字节取决于底层实现。” [链接](man7.org/linux/man-pages/man3/malloc_usable_size.3.html)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多