我们说我分配了一个足够大的char**
数组。
为什么我可以free(arr)
而不是free(arr + 5)
?
请注意,我没有说arr[0]
或arr[5]
。
答案 0 :(得分:2)
您始终使用free()
,malloc()
或realloc()
返回的指针调用calloc()
。你不能传递任何其他指针。
来自free()
手册:
free()函数释放ptr指向的内存空间 必须由之前调用malloc(),calloc()或 realloc的()。否则,或者如果已经调用了free(ptr) 之前,发生未定义的行为。如果ptr为NULL,则不进行任何操作 进行。
答案 1 :(得分:0)
malloc(3)
不起作用。它在内存中分配一个固定大小的数据块,在块的开头添加元数据(如下一个空闲块的地址或块的大小),并在元数据之后返回地址。
free(3)
需要执行元数据中包含的信息(例如,更新其链接列表中空闲块的地址。如果提供的指针尚未由{{1}分配},元数据不存在,malloc(3)
无法执行此操作。
由于这个原因,free
的手册页显然禁止传递一个尚未被`malloc(3)
free(3)
函数释放free()
指向的内存空间, 必须通过之前调用ptr
返回的,malloc()
或calloc()
。否则,或者realloc()
已经存在 之前被调用过,发生了未定义的行为。如果free(ptr)
为ptr
, 没有进行任何操作。
这样做可能会导致未定义的行为,如果您的系统没有采取一些保护措施来防止您这样做,可能会导致安全漏洞,因为NULL
将会写在虚假元数据指向的任意内存区域。