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

时间:2015-05-20 14:37:07

标签: c arrays pointers malloc sizeof

我有这个:

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

我做错了什么?

3 个答案:

答案 0 :(得分:4)

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

  

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

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

8 / sizeof uint16_t = 8 / 2 = 4

您无法检查分配的内存块的大小,您必须信任malloc()才能正常工作,或者如果它不能返回NULL

答案 1 :(得分:3)

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

在你的情况下,发生了什么

  • 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()返回的内存量。

答案 2 :(得分:1)

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

8 / 2等于4。