用 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
的指针。
使用调试器 运行,我可以验证 keylen
是 5
。
但是如果我输入:
int kl = sizeof(bt->node[n].key) / sizeof(bt->node[n].key[0])
kl
是 4
.
我做错了什么?
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].key
是 sizeof <pointer to ...>
,在您的系统中是 8 ( 64 位)。
8 / sizeof uint16_t = 8 / 2 = 4
您无法检查分配的内存块的大小,您必须相信 malloc()
可以正常工作或 return NULL
如果不能。
我有这个:
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
.
我做错了什么?
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].key
是 sizeof <pointer to ...>
,在您的系统中是 8 ( 64 位)。
8 / sizeof uint16_t = 8 / 2 = 4
您无法检查分配的内存块的大小,您必须相信 malloc()
可以正常工作或 return NULL
如果不能。