Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中的空闲分配内存_C_Arrays_Memory_Free - Fatal编程技术网

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())
将垃圾数据解释为具有致命后果的簿记数据。谢谢,我现在就知道了。谢谢,我现在就知道了。然后请标记解决问题的答案!