C中的免费分配内存

时间:2015-11-28 15:52:27

标签: c arrays memory free

我们说我分配了一个足够大的char**数组。

为什么我可以free(arr)而不是free(arr + 5)

请注意,我没有说arr[0]arr[5]

2 个答案:

答案 0 :(得分:2)

您始终使用free()malloc()realloc()返回的指针调用calloc()。你不能传递任何其他指针。

来自free()手册:

  

free()函数释放ptr指向的内存空间   必须由之前调用malloc(),calloc()或          realloc的()。否则,或者如果已经调用了free(ptr)          之前,发生未定义的行为。如果ptr为NULL,则不进行任何操作           进行。

答案 1 :(得分:0)

malloc(3)不起作用。它在内存中分配一个固定大小的数据块,在块的开头添加元数据(如下一个空闲块的地址或块的大小),并在元数据之后返回地址。

Malloc

free(3)需要执行元数据中包含的信息(例如,更新其链接列表中空闲块的地址。如果提供的指针尚未由{{1}分配},元数据不存在,malloc(3)无法执行此操作。

由于这个原因,free的手册页显然禁止传递一个尚未被`malloc(3)

分配的指针
  

free(3)函数释放free()指向的内存空间,   必须通过之前调用ptr返回的,   malloc()calloc()。否则,或者realloc()已经存在   之前被调用过,发生了未定义的行为。如果free(ptr)ptr,   没有进行任何操作。

这样做可能会导致未定义的行为,如果您的系统没有采取一些保护措施来防止您这样做,可能会导致安全漏洞,因为NULL将会在虚假元数据指向的任意内存区域。