假设我使用malloc
请求可用空间。变量ptr
指向创建的内存空间。在我的代码中,ptr
的值被更改为访问我分配的空间中的不同位置。
在free(ptr)
更改后,调用ptr
会不正确,不是吗?我应该做的是在ptr
之后创建malloc
的副本。应该在free
函数调用中使用这个新指针。是吗?
干杯
答案 0 :(得分:4)
在
free(ptr)
更改后调用ptr
会不正确,不是吗?
这是正确的理解。这不正确。
我应该做的是在
ptr
之后创建malloc
的副本。应该在free
函数调用中使用这个新指针。是吗?
您有以下选择:
保留原始变量并使用副本指向malloc
ed数据的不同位置。使用原始变量调用free
。
制作副本,使用原始变量指向malloc
ed数据的不同位置。使用副本致电free
。
保留原始指针。使用索引访问malloc
ed数据的不同位置。使用原始变量调用free
。
无论您访问malloc
返回的数据的不同位置的方式如何,malloc
返回的指针值都必须在free
的调用中使用。< / p>
答案 1 :(得分:2)
是的,您的理解和建议的解决方案是正确的。而且,根据C11标准,
7.22.3.3
free
函数...如果参数与之前由内存管理函数返回的指针不匹配,或者如果通过调用
free
或realloc
释放了空间,则行为未定义< / p>
因此,在您分配的内存中间某处尝试free
会导致未定义的行为,并可能会破坏您的程序。
答案 2 :(得分:1)
根据第7.20.3.2节,c99
标准,第2段[强调我的]
free
函数导致ptr
指向的空间被释放,即可用于进一步分配。如果ptr
是空指针,则不执行任何操作。否则, 如果参数与之前由calloc
,malloc
或realloc
函数 返回的指针不匹配,或者如果通过调用free
或realloc
, 已取消分配空间,行为未定义。
因此,您无法将指针传递给free()
或家人未返回的malloc()
。你很对。
为了完成工作,您可以在开始时制作malloc()
返回的原始指针的副本,一旦完成使用内存,您需要调用free()
使用之前存储的值。
答案 3 :(得分:0)
是。你明白了。当ptr
更改为指向其他位置时,调用free
将由malloc
分配的内存不会被取消分配。
您需要保留返回指针的副本。