首页 文章

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

提问于
浏览
1

假设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

    我不认为这一般可以回答,除非“你不能”,因为真的没有办法使用标准库的堆API来做到这一点 .

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

相关问题