如何在c中释放一部分连续分配的内存?
How to free a part of contiguous allocated memory in c?
我是 C 的新手。我有一个程序使用存储指针的 calloc()
分配一些内存。这些指针指向内存中我存储人员数据的位置。每个人一个指针。所以当我需要删除数据时,我free()
指向这些数据的指针。但是带有指针的内存仍然有那个。我也想释放那个地方。据我所知,例如,我不能说 free(ptr+5)
。我该怎么做?
您不能释放已分配块的开头或中间,而单独留下已分配块的末尾;所以(用于删除数组中的条目):
将您要删除的条目之后的所有内容移动到分配块的末尾,朝向分配块的开头;这样要删除的部分在最后
使用realloc()
减小分配块的大小(以释放末尾的块)。
狡猾的例子(假设 i
是您要释放的条目):
memmove(&myArray[i], &myArray[i+1], (total_entries - 1 - i) * sizeof(myArray[0]) );
temp = realloc(myArray, total_entries - 1 * sizeof(myArray[0]));
if(temp == NULL) {
/* Ooops. Need to handle the error somehow */
} else {
myArray = temp;
total_entries--;
}
我是 C 的新手。我有一个程序使用存储指针的 calloc()
分配一些内存。这些指针指向内存中我存储人员数据的位置。每个人一个指针。所以当我需要删除数据时,我free()
指向这些数据的指针。但是带有指针的内存仍然有那个。我也想释放那个地方。据我所知,例如,我不能说 free(ptr+5)
。我该怎么做?
您不能释放已分配块的开头或中间,而单独留下已分配块的末尾;所以(用于删除数组中的条目):
将您要删除的条目之后的所有内容移动到分配块的末尾,朝向分配块的开头;这样要删除的部分在最后
使用
realloc()
减小分配块的大小(以释放末尾的块)。
狡猾的例子(假设 i
是您要释放的条目):
memmove(&myArray[i], &myArray[i+1], (total_entries - 1 - i) * sizeof(myArray[0]) );
temp = realloc(myArray, total_entries - 1 * sizeof(myArray[0]));
if(temp == NULL) {
/* Ooops. Need to handle the error somehow */
} else {
myArray = temp;
total_entries--;
}