假设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 回答
你无法对内存进行碎片整理,如果你想这样做,你可以打电话给我 .
我已经遇到过这种情况,但我现在还没有代码我仍然相信你不能这样做,因为这是不可能的
我不认为这一般可以回答,除非“你不能”,因为真的没有办法使用标准库的堆API来做到这一点 .
您可以使用专用分配器而不是标准库,这可能会暴露更多功能以支持堆的碎片化 .