如何在重新分配我们如何将中间释放的内存带到一个块内存后分配动态内存并重新分配

时间:2017-04-19 12:30:15

标签: c dynamic-memory-allocation

假设10k堆

int *p1;
p1 = malloc(3*K); 

然后,再请求4K:

p2 = malloc(4*K);

3K的内存现已免费。

一段时间后,p1指向的第一个内存分配被解除分配:

free(p1);

这使得两个3K块中的6K内存空闲。发出进一步的4K分配请求:

p1 = malloc(4*K);

这会导致失败 - 将NULL返回到p1 - 因为即使有6K的内存可用,也没有可用的4K连续块

如何合并两个3K块以制作6K的单个?

以下代码给出了分段错误。

如果我释放2和4行释放内存两个块marge作为一个块怎么可能

#include<stdio.h>
#include<stdlib.h>

int** allocate2D(int rows,int cols)
{
int **arr2D;
int i;
arr2D = (int**)malloc(rows*sizeof(int*));
for(i=0;i<rows;i++)
{
    arr2D[i] = (int*)malloc(cols*sizeof(int));
}
}
void deallocate2D(int** arr2D,int rows)
{
int i,a,b;
printf("Enter from which row you want to delete");
scanf("%d",&a);
printf("Enter till which row you want to delete");
scanf("%d",&b);
for(i=a;i<b;i++)
{
    free(arr2D[i]);
}

}
main( )
{
int i,j,k;
int **arr2D;
arr2D=allocate2D(5,5);
for(i=0;i<5;i++)
{
   for(j=0;j<5;j++)
      {
        scanf("%d" ,arr2D[i][j]);
      }
}
deallocate2D(arr2D,k);
}

2 个答案:

答案 0 :(得分:1)

你不能对内存进行碎片整理,如果你想这样做,你可以给我打电话。

我已经遇到过这种情况,但我现在还没有代码我仍然相信你不能这样做,因为它是不可能的

答案 1 :(得分:0)

我不认为这一般可以回答,除非&#34;你不能&#34;#34;因为实际上没有办法使用标准库的堆API来实现这一点。

您可以使用专用分配器而不是标准库,这可能会暴露更多功能以支持堆的碎片化。