释放指定的指针

cxp*_*ong 13 c free

以下代码是否释放了分配给的内存x

int main()
{
    char *x = (char*)calloc(100, sizeof(char));
    char *y = x;
    free(y);
}
Run Code Online (Sandbox Code Playgroud)

Spi*_*rix 18

当你这样做

char *y = x;
Run Code Online (Sandbox Code Playgroud)

y指出指向的位置x.由于y指向返回的内存位置calloc,

free(y);
Run Code Online (Sandbox Code Playgroud)

完全有效.正如@haccks 评论的那样,如果你y指向另一个内存位置,如果malloc/ calloc/ 没有返回这个内存位置,这将不起作用realloc.


在C中,你不应该转换malloc/ calloc/ 的结果realloc.另外,检查返回值calloc是否成功是好的.callocNULL在失败时返回.


Aru*_*run 5

这个问题的原始版本有

int *y = x;
free(y);
Run Code Online (Sandbox Code Playgroud)

即分配char指针的int指针,然后调用free()int指针.的签名free()void free(void *ptr);这样不论char *int *,内存将被释放.

该问题的编辑(和当前)版本具有

char *y = x;
free(y);
Run Code Online (Sandbox Code Playgroud)

在这里,无论是yx指向相同的内存.这称为指针别名.在打电话给free()那个记忆肯定会被释放.

然而,问题在于free(y),指针x悬空,即它指向的存储器不再有效.

注意,既没有必要也没有建议从中转换返回值calloc.

  • 将"分配给不兼容的指针类型"本身并不会导致未定义的行为.如果取消引用不兼容类型的指针,则会导致未定义的行为.问题原始版本中的代码没有这样做,因此未显示未定义的行为. (2认同)