这是没有任何错误的代码,
struct Node{
int data;
struct Node* next;
}n1;
void main(){
int *head = NULL;
head = &n1;
// more code..
}
将结构的地址保存到一个应该保存整数地址的指针中是不是错了。我应该将其初始化为struct Node* head = NULL;
是吗,任何地址都需要相同的空间来保存?(类型都是关于分配的空间,不是吗?)
答案 0 :(得分:2)
此代码格式错误。如果其中一个指针为void *
,则只能在不兼容类型的指针之间进行分配。编译器必须提供诊断消息
然而,这是合法的(如果您的编译器仅对原始代码给出“警告”,那么它可能会将代码转换为此并继续):
head = (int *)&n1;
然后,您可以像编写head
一样操作head = &n1.data;
。
没有对齐问题,因为结构总是为其第一个成员正确对齐。没有严格别名问题,因为左值*head
的类型为int
,而别名的数据的有效类型为int
;并且int
与int
兼容。 (一个int
是结构成员而另一个不是)并不重要。
答案 1 :(得分:1)
这是一个逻辑错误,而不是语法问题。编译器通常不应该为此产生任何错误消息。
在这里,您将地址&n1
放入指针变量head
,语法有效。编译器没有理由引发错误。它应该[必须]产生关于数据类型不兼容的警告消息。
底线:在编译器中启用警告并注意发出的警告。他们在那里是为了一个resaon。