为什么将 int(或任何)指针指向结构不会出错

why pointing an int(or any) pointer to a struct doesn't give error

这是可以正常运行的代码,

struct Node{
  int data;
  struct Node* next;
}n1;

void main(){
    int *head = NULL;
    head = &n1;
    // more code..
}

将结构的地址保存到应该保存整数地址的指针中是不是错误的。我应该将其初始化为 struct Node* head = NULL;

是不是,任何东西的地址都需要相同的 space 来保存?(类型都是关于分配的 space,不是吗?)

这是逻辑错误,不是语法问题。通常情况下,编译器不应为此产生任何错误消息。

在这里,您将地址 &n1 放入指针变量 head 中,该变量 在语法上 有效。编译器没有理由引发错误。不过,它应该[必须]产生关于数据类型不兼容的警告消息。

底线: 在编译器中启用警告并注意发出的警告。他们在那里是为了一个原因。

此代码格式错误。如果其中之一是void *,则只能在不兼容类型的指针之间进行赋值。编译器必须给出诊断信息

但是这是合法的(如果您的编译器只为原始代码提供 "warning",那么它可能会将代码转换为这样并继续):

head = (int *)&n1;

然后就可以像写head = &n1.data;一样操作head了。

不存在对齐问题,因为结构始终与其第一个成员正确对齐。不存在严格别名问题,因为左值 *head 的类型为 int 并且被别名的数据的有效类型为 intintint 兼容。 (一个 int 是结构成员而另一个不是结构成员并不重要)。