假设我使用malloc
请求可用空间。变量ptr
指向所创建的内存空间。在我的代码中,ptr
的值被更改为访问我分配的空间中的不同位置。
在ptr
更改后调用free(ptr)
是不正确的,不是吗?。相反,我应该做的是在malloc
之后创建ptr
的副本。应该在free
函数调用中使用这个新指针。是这样吗?
干杯
在
ptr
更改后调用free(ptr)
是不正确的,不是吗?
这是正确的理解。这是不对的。
相反,我应该做的是在
malloc
之后创建ptr
的副本。应该在free
函数调用中使用这个新指针。是这样吗?
您可以在这里进行以下选择:
-
保留原始变量并使用副本指向
malloc
ed数据的不同位置。使用原始变量调用free
。 -
制作一个副本,使用原始变量指向
malloc
ed数据的不同位置。使用副本调用free
。 -
保留原始指针。使用索引访问
malloc
ed数据的不同位置。使用原始变量调用free
。
无论以何种方式访问malloc
返回的数据的不同位置,在对free
的调用中都必须使用malloc
返回的指针值。
是的,您的理解和建议的解决方案是正确的。此外,根据C11标准,
7.22.3.3
free
功能如果参数与内存管理函数先前返回的指针不匹配,或者调用
free
或realloc
释放了空间,则行为为未定义
因此,尝试在分配的内存中间的某个位置free
会导致未定义的行为,并可能破坏程序。
根据c99
标准第7.20.3.2章第2段[强调矿]
free
函数使ptr
指向的空间被解除分配,也就是说,使其可用于进一步分配。如果ptr
是空指针,则不会发生任何操作。否则,如果参数与calloc
、malloc
或realloc
函数早些时候返回的指针不匹配,或者如果通过调用free
或realloc
释放了空间,则行为未定义
因此,不能将指针传递给malloc()
或族未返回的free()
。你说得很对。
为了完成任务,一开始,您必须复制malloc()
返回的原始指针,一旦使用完内存,您需要使用之前存储的值调用free()
。
是。你理解得对。当ptr
改变为指向不同的位置时,调用free
将不会解除分配由malloc
分配的内存
您需要保留一份返回指针的副本。