我完成了以下内存分配
int * a;
一个= malloc的(5 *的sizeof(int)的);
有没有办法自由说出这套的第五个位置?
即我可以免费(a + 4)??
目前,这会产生分段错误。
答案 0 :(得分:0)
如果您只想释放部分空间,请使用realloc()。
答案 1 :(得分:0)
不,你不能做free(a+4)
等。
为什么呢?因为C标准禁止它。
您必须将malloc()
返回的确切指针传递给free()
,而不需要任何指针算法。
http://www.kernel.org/doc/man-pages/online/pages/man3/free.3.html
free()
函数释放 ptr 指向的内存空间,它必须具有 之前致电malloc()
,calloc()
或realloc()
。
为什么标准禁止它?这是因为malloc()
的某些实现将头信息存储在a-4
(或任何地方)位置,而free()
在内部通过指针算法读取它。如果给出了像a+4
那样的移位指针,它将错过标题信息并被搞砸。
比照
顺便说一下,一些libc实现提供了非标准函数,它返回分配的内存块的大小:
如果您对如何实施和查看源代码感到好奇,您经常会发现他们在a-4
等处读取了标题信息:
好的,回到最初的问题。
如果你想缩短(或延长)你用malloc()
分配的内存块,你可以使用realloc()
作为@Gustav说。但是如果要从内存块的中间删除几个字节,则需要手动重新分配和复制。实际上realloc()
可能在内部做类似的工作,所以要小心返回的指针可能与原始指针不同。