是否可以通过任何Windows API分配7个字节的内存并释放前3个字节以形成4个字节的块。
答案 0 :(得分:3)
您可以使用memmove()
将最后四个字节移动到已分配块的开头,然后使用realloc()
将其缩小到四个字节。
但你为什么要这样做?您总是可以使用另一个指向malloced内存最后四个字节的指针,如下所示:
typedef unsigned char uint8;
uint8* psevenbytes = (uint8*)malloc(sizeof(uint8) * 7);
if (psevenbytes != NULL)
{
uint8* pfourbytes = psevenbytes + 3;
// ... do stuff
free(psevenbytes);
psevenbytes = NULL;
}
或者您可以使用struct
。
答案 1 :(得分:2)
没有。 Windows堆分配API需要返回自然对齐的值(换句话说,块地址%sizeof(void *)== 0)。对于32位处理器,这意味着每个分配都是4字节对齐的。如果有一种方法可以做你想要的,那么新重新分配的块将在3字节边界上对齐(初始的7字节块将在4字节边界上对齐,添加3个字节会产生3字节对齐的指针。
正如其他人所建议的,复制内存可以让你最接近你的要求。但是会有一些与之相关的性能成本。
答案 2 :(得分:1)
没有
但你可以很好地使用memmove和realloc来减少使用的内存量:
memmove(ptr, ptr + 3, 4);
ptr = realloc(ptr, 4)
但这很可能比仅将内存保持在初始大小要慢。