用 malloc 分配的数组大小显示比预期少一

size of array allocated with malloc is showing one less than expected

我有这个:

alloc(Btree *bt, uint8_t *keylen, int16_t n)
{

bt->node[n].key = malloc(sizeof(int16_t)*(*keylen));
{

其中 bt->node[n].key 是指向 int16_t 的指针。

使用调试器 运行,我可以验证 keylen5

但是如果我输入:

int kl = sizeof(bt->node[n].key) / sizeof(bt->node[n].key[0])

kl4.

我做错了什么?

sizeof(bt->node[n].key)sizeof(uint16_t*) 可能是 8(在 64 位上) sizeof(bt->node[n].key[0])sizeof(*(uint16_t*)) 即 2

并且8 / 2等于4。

sizeof 运算符生成 type 大小 ,而不是分配给指针 的内存量 ].

你的情况是

  • key 的类型是 int16_t *
  • sizeof(bt->node[n].key) 在 64 位上给出 sizeof(int16_t *)8
  • sizeof(bt->node[n].key[0])也就是sizeof(int16_t ),也就是2

最终,它是 8/2 = 4。

malloc().

返回的内存量绝对没有测量

仔细看,你把指针和数组混淆了:

Where bt->node[n].key is a pointer to int16_t.

因此,bt->node[n].key 是指向已分配内存的指针,而不是已分配内存本身,并且 sizeof bt->node[n].keysizeof <pointer to ...>,在您的系统中是 8 ( 64 位)。

8 / sizeof uint16_t = 8 / 2 = 4

您无法检查分配的内存块的大小,您必须相信 malloc() 可以正常工作或 return NULL 如果不能。