Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 内存分配和释放_C_Windows_Winapi_Memory_Memory Leaks - Fatal编程技术网

C 内存分配和释放

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) 但这很可能比保

是否可以通过任何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()
将最后四个字节移动到分配块的开头,然后使用
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位系统上,它很可能会