从一组连续的内存位置删除所选位置

时间:2012-02-08 05:57:20

标签: dynamic-arrays

我完成了以下内存分配 int * a;
一个= malloc的(5 *的sizeof(int)的);
有没有办法自由说出这套的第五个位置?

即我可以免费(a + 4)??

目前,这会产生分段错误。

2 个答案:

答案 0 :(得分:0)

如果您只想释放部分空间,请使用realloc()。

答案 1 :(得分:0)

不,你不能做free(a+4)等。

为什么呢?因为C标准禁止它。 您必须将malloc()返回的确切指针传递给free(),而不需要任何指针算法。

为什么标准禁止它?这是因为malloc()的某些实现将头信息存储在a-4(或任何地方)位置,而free()在内部通过指针算法读取它。如果给出了像a+4那样的移位指针,它将错过标题信息并被搞砸。 比照

顺便说一下,一些libc实现提供了非标准函数,它返回分配的内存块的大小:

如果您对如何实施和查看源代码感到好奇,您经常会发现他们在a-4等处读取了标题信息:

好的,回到最初的问题。 如果你想缩短(或延长)你用malloc()分配的内存块,你可以使用realloc()作为@Gustav说。但是如果要从内存块的中间删除几个字节,则需要手动重新分配和复制。实际上realloc()可能在内部做类似的工作,所以要小心返回的指针可能与原始指针不同。

相关问题