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