为什么将 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
并且被别名的数据的有效类型为 int
; int
与 int
兼容。 (一个 int
是结构成员而另一个不是结构成员并不重要)。
这是可以正常运行的代码,
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
并且被别名的数据的有效类型为 int
; int
与 int
兼容。 (一个 int
是结构成员而另一个不是结构成员并不重要)。