我一直在使用来自Stanford CS Library的材料审核C中单链表的基础知识,我在这里找到了以下代码:
struct node{
int data;
struct node* next;
};
struct node* BuildWithDummyNode(){
struct node dummy;
struct node* tail = & dummy; // this line got me confused
int i;
dummy.next = NULL;
for (i=1;i<6;i++){
Push(&(tail->next), i);
tail = tail->next;
}
return dummy.next;
}
可能不是revenant,但Push()的代码是:
void Push(struct node** headRef, int data){
struct node* NewNode = malloc(sizeof(struct node));
newNode->data = data;
newNode->next = *headRef;
*headRef = newNode;
}
一切都顺利进行,但我总是认为无论何时定义指针,它都必须指向已定义的变量。但这里变量&#34; dummy&#34;仅声明且未初始化。不应该至少产生某种警告吗?
我知道默认情况下一些变量被初始化为0,并且在打印dummy.data之后它确实打印了0.所以这是一个&#34;可行但不好的练习&#34;的实例,或者我完全错过了什么?
非常感谢!
答案 0 :(得分:2)
变量dummy
已在以下声明中声明:
struct node dummy;
表示已为其分配内存。换句话说,这意味着它现在有一个与之关联的地址。因此,指针tail
在以下行中声明:
struct node* tail = & dummy;
存储其地址非常有意义。
答案 1 :(得分:1)
&#34;但这里变量&#34; dummy&#34;仅声明且未初始化。&#34;
变量声明将其引入范围。你推断它是正确的,它的值是未指定的,但从它进入范围的那一刻起,它的地址就被明确定义,直到它超出范围。
更简单地说:你的程序是正确的,因为你不依赖于未初始化的变量值,而是依赖于明确定义的地址。