是否应该将指针传递给free()指向已分配空间的开头?

时间:2015-03-18 06:44:30

标签: c pointers malloc free

假设我使用malloc请求可用空间​​。变量ptr指向创建的内存空间。在我的代码中,ptr的值被更改为访问我分配的空间中的不同位置。

free(ptr)更改后,调用ptr会不正确,不是吗?我应该做的是在ptr之后创建malloc的副本。应该在free函数调用中使用这个新指针。是吗?

干杯

4 个答案:

答案 0 :(得分:4)

  

free(ptr)更改后调用ptr会不正确,不是吗?

这是正确的理解。这不正确。

  

我应该做的是在ptr之后创建malloc的副本。应该在free函数调用中使用这个新指针。是吗?

您有以下选择:

  1. 保留原始变量并使用副本指向malloc ed数据的不同位置。使用原始变量调用free

  2. 制作副本,使用原始变量指向malloc ed数据的不同位置。使用副本致电free

  3. 保留原始指针。使用索引访问malloc ed数据的不同位置。使用原始变量调用free

  4. 无论您访问malloc返回的数据的不同位置的方式如何,malloc返回的指针值都必须在free的调用中使用。< / p>

答案 1 :(得分:2)

是的,您的理解和建议的解决方案是正确的。而且,根据C11标准,

  

7.22.3.3 free函数

     

...如果参数与之前由内存管理函数返回的指针不匹配,或者如果通过调用freerealloc释放了空间,则行为未定义< / p>

因此,在您分配的内存中间某处尝试free会导致未定义的行为,并可能会破坏您的程序。

答案 2 :(得分:1)

根据第7.20.3.2节,c99标准,第2段[强调我的]

  

free函数导致ptr指向的空间被释放,即可用于进一步分配。如果ptr是空指针,则不执行任何操作。否则, 如果参数与之前由callocmallocrealloc函数 返回的指针不匹配,或者如果通过调用freerealloc 已取消分配空间,行为未定义。

因此,您无法将指针传递给free()或家人未返回的malloc()。你很对。

为了完成工作,您可以在开始时制作malloc()返回的原始指针的副本,一旦完成使用内存,您需要调用free()使用之前存储的值。

答案 3 :(得分:0)

是。你明白了。当ptr更改为指向其他位置时,调用free将由malloc分配的内存不会被取消分配。
您需要保留返回指针的副本。