在释放另一个包含与 p1 相同地址的指针 p2 后,指针 p1 是否可以访问?

Will a pointer p1 be accessible after freeing another pointer p2 containing the same address as p1?

如果您将一个指针分配给具有相同结构的另一种类型定义的另一个指针,然后您释放前一个并只使用最后一个,那么程序是否存在某种风险,即程序可能会出现分段错误分配了相同的地址?

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

struct Class{
 int data;
 struct Class *next;
}key;

int main(){
 key *newclass = malloc(sizeof(*newclass));
 newclass->data = 5;
 newclass->next = NULL;
 
 key *newclass2;
 newclass2 = newclass;
 
 newclass = NULL;
 free(newclass);

 printf("%d", newclass2->data);
 
 return 0;
}

对于初学者来说,结构定义中似乎有拼写错误。我想你的意思是

typedef struct Class{
 int data;
 struct Class *next;
}key;

这次作业后

 newclass2 = newclass;

两个指针指向相同的动态分配内存。

然后指针newclass被重新赋值为NULL

 newclass = NULL;

因此为空指针免费调用函数

 free(newclass); 

没有效果。

指针 newclass2 仍然指向动态分配的内存,您应该释放它,然后就不再需要它了。

 free(newclass2);

如果您要删除此作业

 newclass = NULL;

然后用这个指针调用 free 之后

 free(newclass); 

指针newclass2中存储的值将无效,您不能使用它来访问已释放的内存。

但是作为局部变量的两个指针仍然存在,你可以给它们赋新的值。

指针只是对内存的索引。它指向的不是 'data' 本身。这是它指向的内存的索引。

我在这里做一个假设然后说

newclass = NULL;

是错误完成的,因为如果不是,你现在有内存泄漏。

如果您正确管理所有这些指针,那么让多个指针指向同一个内存并没有错(纯粹谈论技术性,而不是就这是否是一种不好的做法发表任何声明。)。 问题是,如果您释放该内存而忘记管理这些指针中的一个,并尝试通过该指针对该释放的内存块执行操作,那绝对是个问题。

指针指向的内存块被释放的事实并没有释放 'pointer' 本身。您仍然可以将指针用于各种用途;从指针算法到使它们指向不同的内存块。黄金法则是不对您的指针之前索引的内存地址执行任何内存操作。