c-传递给free()的指针是否应该指向已分配空间的起始位置



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

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

干杯

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

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

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

您可以在这里进行以下选择:

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

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

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

无论以何种方式访问malloc返回的数据的不同位置,在对free的调用中都必须使用malloc返回的指针值。

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

7.22.3.3 free功能

如果参数与内存管理函数先前返回的指针不匹配,或者调用freerealloc释放了空间,则行为为未定义

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

根据c99标准第7.20.3.2章第2段[强调矿]

free函数使ptr指向的空间被解除分配,也就是说,使其可用于进一步分配。如果ptr是空指针,则不会发生任何操作。否则,如果参数与callocmallocrealloc函数早些时候返回的指针不匹配,或者如果通过调用freerealloc释放了空间,则行为未定义

因此,不能将指针传递给malloc()或族未返回的free()。你说得很对。

为了完成任务,一开始,您必须复制malloc()返回的原始指针,一旦使用完内存,您需要使用之前存储的值调用free()

是。你理解得对。当ptr改变为指向不同的位置时,调用free将不会解除分配由malloc分配的内存
您需要保留一份返回指针的副本。

相关内容

  • 没有找到相关文章

最新更新