【发布时间】:2022-01-25 19:12:08
【问题描述】:
如果您将相同地址的指针分配给具有相同结构的另一种类型定义的另一个指针,那么程序可能会出现分段错误,然后您释放前一个并仅使用最后分配的同一个地址?
#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;
}
【问题讨论】:
-
是的,这是非法的。两个指针都指向同一个内存,即
freed。之后,两个指针都指向一个无效的位置。 -
实际上,
free(newclass);调用不会执行任何操作...因为前面的newclass = NULL;行。而newclass2仍将指向原始分配的内存。 -
free()释放其参数指向的内存(如果有)。这使得指向已释放区域的 all 指针(in)无效。它与变量无关,如果有的话,free()的参数是从中获取的。当然free()本身并没有看到这一点。 -
你不是
free指针,你是free内存。指针只是告诉free是哪个内存。 -
可能值得研究“对象”(与 OOP 对象无关)和“存储持续时间”(自动、静态、线程、动态)的 C 概念。
标签: c memory linked-list