C语言中的空闲分配内存
假设我分配了一个足够大的C语言中的空闲分配内存,c,arrays,memory,free,C,Arrays,Memory,Free,假设我分配了一个足够大的char**数组 为什么我可以做免费(arr),但不能做免费(arr+5) 请注意,我不是说arr[0]或arr[5]您总是使用malloc()、realloc()或calloc()返回的指针调用free()。您不能通过任何其他指针 从手册中: 函数的作用是:释放ptr指向的内存空间 必须已由以前调用malloc()、calloc()或 realloc()。否则,或者如果已经调用了free(ptr) 在此之前,会发生未定义的行为。如果ptr为NULL,则不执行任何操作 表
char**
数组
为什么我可以做免费(arr)
,但不能做免费(arr+5)
请注意,我不是说arr[0]
或arr[5]
您总是使用malloc()
、realloc()
或calloc()
返回的指针调用free()
。您不能通过任何其他指针
从手册中:
函数的作用是:释放ptr指向的内存空间
必须已由以前调用malloc()、calloc()或
realloc()。否则,或者如果已经调用了free(ptr)
在此之前,会发生未定义的行为。如果ptr为NULL,则不执行任何操作
表演
malloc(3)
不是这样工作的。它在内存中分配固定大小的数据块,在块的开头添加元数据(如下一个空闲块的地址或块的大小),并在元数据之后返回地址
free(3)
需要执行元数据中包含的信息(例如,更新其链接列表中空闲块的地址。如果您提供的指针未由malloc(3)
分配,则元数据不存在,free
无法执行此操作
因此,free(3)
的手册页明确禁止传递未由`malloc(3)分配的指针
free()
函数释放ptr
指向的内存空间,
它必须是以前调用malloc()
时返回的,
calloc()
,或者realloc()
。否则,或者如果free(ptr)
已经
以前被调用过,将发生未定义的行为。如果ptr
为NULL
,
不执行任何操作
这样做可能会导致未定义的行为,如果您的系统没有设置一些保护措施来阻止您这样做,则可能会导致安全漏洞,因为
free(3)
将写入伪元数据指向的任意内存区域。不应像“不得”中那样谢谢,我现在明白了。@fuzzxl确实。谢谢。主要是因为标准这么说。出于更技术的原因,一些malloc()
实现将簿记数据放在分配的内存区域之前。将指针malloc()
以外的内容传递给free()
将导致free())
将垃圾数据解释为具有致命后果的簿记数据。谢谢,我现在就知道了。谢谢,我现在就知道了。然后请标记解决问题的答案!