Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 传递给free()的指针是否应该指向所分配空间的开头?_C_Pointers_Malloc_Free - Fatal编程技术网

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的确谢谢你的提醒。我更新了答案。