2012-02-08 54 views
0

我已完成以下内存分配
int * a;
a = malloc(5 * sizeof(int));
有没有一种方法可以自由地说出这个集合的第5个位置?从一组连续内存位置中删除选定位置

ie ie can do free(a + 4)??

目前这给出了分段错误的错误。

回答

0

不,你不能这样做free(a+4)

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

为什么标准禁止它?这是因为malloc()的某些实现将标头信息存储在位置a-4(或任何地方)和free()内部通过指针算术来读取它。如果它被给了一个像a+4这样的移位指针,它会错过标题信息并被搞乱。 参考。

另外一些libc的实现提供返回分配的内存块的大小非标准功能:如果你好奇

他们如何实现并查看他们的源代码,你经常会发现他们在a-4等读取头信息:

OK,回到原来的问题。 如果您想要缩短(或延长)您使用malloc()分配的内存块,您可以使用realloc(),如@Gustav所述。但是如果你想从你的内存块中删除几个字节,你需要手动重新分配和复制。实际上realloc()可能会在内部做一个类似的工作,所以请注意返回的指针可能与原始指针不同。

0

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