C内存管理具有更多指向同一位置的指针

AR8*_*R89 2 c pointers memory-management function

我正在玩这个代码:

#include <stdlib.h>
#include <stdio.h>

void function(int *p){
    free(p);
}

int main(){
    int *i = calloc(3, sizeof(int));
    function(i);
    i[0] = 'a';
    printf("%c\n", i[0]);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我希望得到一个错误,但它打印'a',如果'a'被解除分配,为什么打印它?函数(int*p)中发生的事情有什么影响,如果main()?(如果可以的话,解释那个'p'指针发生了什么)

假设我在同一个函数中有这两个:

int *a = malloc(...);
int *b = a;
Run Code Online (Sandbox Code Playgroud)

它们都指向同一块内存,但是当我必须释放它时,我应该在它们两个上调用free,还是只调用其中一个?(再次解释为什么可能)

Lew*_*rin 5

这是未定义的行为.释放指针只是告诉操作系统可以覆盖分配的内存.由于缺乏更好的词,记忆依旧存在.但是任何事情都可能发生..它现在可以为你打印,有时它可能是另一个字符或数字,因为另一个程序写入了该内存位置......任何事情都可能发生.

对于你的上一个问题.. a和b只是一个地址的符号名称.在地址上免费拨打电话非常重要,所以不管你做什么,free(a)或者free(b)你都很棒.