繁体   English   中英

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

[英]Should the pointer being passed to free() point to the start of the allocated space?

假设我使用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 ,这是由返回指针的值malloc必须调用来free

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

7.22.3.3 free功能

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

所以试图在你分配的内存中间某处free会导致未定义的行为,并可能会破坏你的程序。

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

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

因此,您无法将指针传递给malloc()或family不返回的free() 你说得对。

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

是。 你明白了。 ptr被更改为指向不同的位置时,调用free将将malloc分配的malloc不会被释放。
您需要保留返回指针的副本。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM