C 传递给free()的指针是否应该指向所分配空间的开头?
假设我使用C 传递给free()的指针是否应该指向所分配空间的开头?,c,pointers,malloc,free,C,Pointers,Malloc,Free,假设我使用malloc请求一个空闲空间。变量ptr指向创建的内存空间。在我的代码中,ptr的值被更改为访问我分配的空间中的不同位置 更改ptr后调用free(ptr),将不正确,否?。我应该做的是在malloc之后创建ptr的副本。这个新指针应该在free函数调用中使用。是这样吗 干杯 更改ptr后调用free(ptr),将不正确,不是吗 这是正确的理解。这是不对的 我应该做的是在malloc之后创建ptr的副本。这个新指针应该在free函数调用中使用。是这样吗 您可以在此处进行以下选择: 保留
malloc
请求一个空闲空间。变量ptr
指向创建的内存空间。在我的代码中,ptr
的值被更改为访问我分配的空间中的不同位置
更改ptr
后调用free(ptr)
,将不正确,否?。我应该做的是在malloc
之后创建ptr
的副本。这个新指针应该在free
函数调用中使用。是这样吗
干杯
更改ptr
后调用free(ptr)
,将不正确,不是吗
这是正确的理解。这是不对的
我应该做的是在malloc
之后创建ptr
的副本。这个新指针应该在free
函数调用中使用。是这样吗
您可以在此处进行以下选择:
malloc
ed数据的不同位置。使用原始变量调用free
malloc
ed数据的不同位置。使用copy调用free
malloc
ed数据的不同位置。使用原始变量调用free
无论您以何种方式访问由
malloc
返回的数据的不同位置,在调用free
时必须使用由malloc
返回的指针值。你理解得对。当ptr
更改为指向不同的位置时,调用free
将不会释放malloc
分配的内存。您需要保留一份返回指针的副本。是的,您的理解和建议的解决方案是正确的。此外,根据C11标准 7.22.3.3
免费
功能
…如果参数与内存管理函数先前返回的指针不匹配,或者如果通过调用free
或realloc
释放了空间,则行为未定义
<尝试> <代码>免费> /代码>在您所分配的内存的某个地方导致不明确的行为,并可能打断您的程序。 < P> >第7.20.3.2章,<代码> C99 < /Cuth>标准,第二段[强调矿山]
free
功能使ptr
指向的空间被释放,即可供进一步分配。如果ptr
是空指针,则不会发生任何操作。否则,如果参数与calloc
、malloc
或realloc
函数先前返回的指针不匹配,或者如果通过调用free
或realloc
释放空间,则行为未定义。
因此,您不能传递指向free()
的指针,该指针不是由malloc()
或family返回的。你说得很对
要完成任务,首先,您必须复制由
malloc()
返回的原始指针,一旦使用完内存,您需要使用以前存储的值调用free()
。第三个选项是指针算术。保持指针不变,并具有index@sp2danny的确谢谢你的提醒。我更新了答案。