C 内存分配和释放
是否可以通过任何Windows API分配7个字节的内存并释放前3个字节以形成4个字节的块 没有 但是您可以很好地使用memmove和realloc来减少所使用的内存量:C 内存分配和释放,c,windows,winapi,memory,memory-leaks,C,Windows,Winapi,Memory,Memory Leaks,是否可以通过任何Windows API分配7个字节的内存并释放前3个字节以形成4个字节的块 没有 但是您可以很好地使用memmove和realloc来减少所使用的内存量: memmove(ptr, ptr + 3, 4); ptr = realloc(ptr, 4) 但这很可能比仅仅保持内存的初始大小要慢。不 但是您可以很好地使用memmove和realloc来减少所使用的内存量: memmove(ptr, ptr + 3, 4); ptr = realloc(ptr, 4) 但这很可能比保
memmove(ptr, ptr + 3, 4);
ptr = realloc(ptr, 4)
但这很可能比仅仅保持内存的初始大小要慢。不
但是您可以很好地使用memmove和realloc来减少所使用的内存量:
memmove(ptr, ptr + 3, 4);
ptr = realloc(ptr, 4)
但这很可能比保持内存的初始大小要慢。您可以使用
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
您可以使用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;
}
或者您可以使用
结构
否。Windows堆分配API需要返回一个自然对齐的值(换句话说,块地址%sizeof(void*)==0)。对于32位处理器,这意味着每个分配都是4字节对齐的。如果有一种方法可以实现您想要的功能,那么新重新分配的块将在3字节边界上对齐(最初的7字节块将在4字节边界上对齐,添加3字节将创建一个3字节对齐指针)
正如其他人所建议的,向下复制内存会使您最接近您所要求的。但这会带来一些性能成本。否。Windows堆分配API需要返回一个自然对齐的值(换句话说,块地址%sizeof(void*)==0)。对于32位处理器,这意味着每个分配都是4字节对齐的。如果有一种方法可以执行您想要的操作,则新重新分配的块将在3字节边界上对齐(初始7字节块将在4字节边界上对齐,添加3字节将创建一个3字节对齐的指针
正如其他人所建议的,向下复制内存会使您最接近您所要求的内容。但这会带来一些性能成本。为什么?如果您更好地描述您想要实现的内容,您会得到有意义的答案…为什么要这样做?为什么不首先分配4个字节?执行realloc并让e实现担心它应该如何获得所需的4个字节你自己实现一个内存分配器。PS:我认为windows没有提供任何保留指针的机制。你可以为你的7字节内存块使用一个长度参数,告诉你“允许”多少内存从中使用。AFAIR Windows本身以4K块管理内存。较低的值由c编译器的内存管理器管理。我需要分配的内存地址是4的倍数。我的地址应该是400、404408、40c等,因此分配7并在其中找到4的倍数。为什么?如果您更好地描述您想要的是什么你会得到有意义的答案…你为什么要这样做?为什么不首先分配4个字节?做一个realloc,让实现担心它应该如何获得你需要的4个字节。如果你需要确定(因为你需要使用相同的指针)你自己实现一个内存分配器。PS:我认为windows没有提供任何保留指针的机制。你可以为你的7字节内存块使用一个长度参数,告诉你“允许”多少内存要从中使用。AFAIR Windows本身以4K块管理内存。较低的值由c编译器的内存管理器管理。我需要分配的内存地址为4的倍数。我的地址应该像400、404408、40c等,因此分配7并在其中找到4的倍数。如果我有另一个指针指向第4个字节和通过这个程序,我不确定我现在是否可以释放前3个字节作为指向第4个字节的指针。你可以吗confirm@Beetle:这是正确的,在该代码中,您必须使用
psevenbytes
指针free
整个块。如果您想释放其中的一部分,您必须使用memmove/realloc
,如前所述ed-但你为什么需要这样做呢?我需要分配的内存地址,如4的倍数。我的地址应该是400404408,40c等,因此分配7并在其中找到4的倍数。还有比这更好的方法吗?@甲壳虫:这是一个非常不寻常的要求!有什么特别的原因吗?在32位系统上,可能性是t它将在4字节边界上对齐。在嵌入式系统上,您通常可以直接指定特定变量的地址。我建议您发布一个更一般的问题,询问如何在4字节边界上强制分配内存,并查看答案。如果我有另一个指针指向第4字节,并通过pro传递gram,我不确定我现在是否可以释放前3个字节作为指向第4个字节的指针。你可以吗confirm@Beetle:这是正确的,在该代码中,您必须使用psevenbytes
指针free
整个块。如果您想释放其中的一部分,您必须使用前面讨论过的memmove/realloc
,但您为什么要需要这样做吗?我需要分配的内存地址,如4的倍数。我的地址应该是400、404408、40c等,因此分配7并在其中找到4的倍数。还有比这更好的方法吗?@甲壳虫:这是一个非常不寻常的要求!有什么特别的原因吗?在32位系统上,它很可能会