为什么指向一个结构的int(或任何)指针不会给出错误

时间:2015-03-10 10:42:04

标签: c struct

这是没有任何错误的代码,

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

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

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

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

2 个答案:

答案 0 :(得分:2)

此代码格式错误。如果其中一个指针为void *,则只能在不兼容类型的指针之间进行分配。编译器必须提供诊断消息

然而,这是合法的(如果您的编译器仅对原始代码给出“警告”,那么它可能会将代码转换为此并继续):

head = (int *)&n1;

然后,您可以像编写head一样操作head = &n1.data;

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

答案 1 :(得分:1)

这是一个逻辑错误,而不是语法问题。编译器通常不应该为此产生任何错误消息。

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

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