我有这个:
alloc(Btree *bt, uint8_t *keylen, int16_t n)
{
bt->node[n].key = malloc(sizeof(int16_t)*(*keylen));
{
其中bt->node[n].key
是指向int16_t
的指针。
在调试器运行的情况下,我可以验证keylen
是5
。
但如果我说:
int kl = sizeof(bt->node[n].key) / sizeof(bt->node[n].key[0])
kl
是4
。
我做错了什么?
答案 0 :(得分:4)
仔细看,你把指针与数组混淆了:
其中bt-> node [n] .key是指向int16_t的指针。
因此,bt-> gt; node [n] .key是指向已分配内存的指针,而不是已分配的内存本身,sizeof bt->node[n].key
为sizeof <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。