打印链表的地址
Print the addresses of a linked list
如何输出变量 *head
和 temp
值。
#include <stdio.h>
#include <stdlib.h>
/* Link list node */
struct node {
int data;
struct node *next;
};
void pushList(struct node **head, int item)
{
struct node *temp = (struct node *) malloc(sizeof (struct node));
temp->data = item;
temp->next = *head;
*head = temp;
printf("*temp = %ld\n"
"temp->data = %d\n"
"temp = %ld\n"
"&temp = %ld\n", *temp, (temp)->data, temp, &temp);
printf
("*head = %ld\n"
"**head = %ld\n"
"(*head)->next = %ld\n"
"head = %ld\n"
"&head = %ld\n", *head, **head, (*head)->next, head, &head);
}
int main()
{
struct node *head = NULL;
printf("&head = %ld\n", &head);
pushList(&head, 1);
printf("\n");
pushList(&head, 2);
return 0;
}
上面的输出是:
&head = 2686732
*temp = 1
temp->data = 0
temp = 1
&temp = 10292624
*head = 10292624
**head = 1
(*head)->next = 0
head = 0
&head = 2686732
*temp = 2
temp->data = 10292624
temp = 2
&temp = 10292656
*head = 10292656
**head = 2
(*head)->next = 10292624
head = 10292624
&head = 2686732
为什么*head
的值等于&temp
?
您正在将 *temp
传递给 printf
,格式说明符 %ld
,表示 long int
。但是,*temp
的类型不是long int
,而是struct node
,大小与long int
不同。这意味着 printf
的参数解析逻辑变得混乱,您不能相信对 printf
的调用的任何输出。例如,请注意 (temp)->data
如何显示为 0
和 10292624
而不是 1
和 2
.
此外,您对大多数字段使用了错误的输出说明符(尽管根据体系结构结果可能是正确的,但它不可移植)。尝试调高编译器的警告级别(对于 gcc,-Wall
会给你一堆警告)。您应该选择将指针转换为 void*
并使用 %p
说明符。
这(具体来说,将 struct node
传递给 printf
)是使 *head
和 &temp
相等的原因。尝试将您的 printf
更改为以下内容,它们应该更有意义:
printf("\n%d\t%p\t%p\n",(temp)->data,temp,&temp);
printf("\n%p\t%p\t%p\t\n\n%p\n\n\n",*head,
(*head)->next,head,&head);
请注意,我删除了参数 *temp
和 **head
,因为它们指的是实际的 struct node
,printf
无法处理。
在您的代码中,行 *head = temp
使 *head
始终与 temp
相同。
函数pushList()
总是在链表的开头添加新元素,head
一直指向链表的第一个元素。所以,显然 *head
等于 temp
因为 temp
指向最后分配的元素,将在开头插入。
顺便说一句,有一种更好的打印变量地址的方法,即使用 %p
而不是 %ld
,这将使您的程序更具可移植性。
如何输出变量 *head
和 temp
值。
#include <stdio.h>
#include <stdlib.h>
/* Link list node */
struct node {
int data;
struct node *next;
};
void pushList(struct node **head, int item)
{
struct node *temp = (struct node *) malloc(sizeof (struct node));
temp->data = item;
temp->next = *head;
*head = temp;
printf("*temp = %ld\n"
"temp->data = %d\n"
"temp = %ld\n"
"&temp = %ld\n", *temp, (temp)->data, temp, &temp);
printf
("*head = %ld\n"
"**head = %ld\n"
"(*head)->next = %ld\n"
"head = %ld\n"
"&head = %ld\n", *head, **head, (*head)->next, head, &head);
}
int main()
{
struct node *head = NULL;
printf("&head = %ld\n", &head);
pushList(&head, 1);
printf("\n");
pushList(&head, 2);
return 0;
}
上面的输出是:
&head = 2686732
*temp = 1
temp->data = 0
temp = 1
&temp = 10292624
*head = 10292624
**head = 1
(*head)->next = 0
head = 0
&head = 2686732
*temp = 2
temp->data = 10292624
temp = 2
&temp = 10292656
*head = 10292656
**head = 2
(*head)->next = 10292624
head = 10292624
&head = 2686732
为什么*head
的值等于&temp
?
您正在将 *temp
传递给 printf
,格式说明符 %ld
,表示 long int
。但是,*temp
的类型不是long int
,而是struct node
,大小与long int
不同。这意味着 printf
的参数解析逻辑变得混乱,您不能相信对 printf
的调用的任何输出。例如,请注意 (temp)->data
如何显示为 0
和 10292624
而不是 1
和 2
.
此外,您对大多数字段使用了错误的输出说明符(尽管根据体系结构结果可能是正确的,但它不可移植)。尝试调高编译器的警告级别(对于 gcc,-Wall
会给你一堆警告)。您应该选择将指针转换为 void*
并使用 %p
说明符。
这(具体来说,将 struct node
传递给 printf
)是使 *head
和 &temp
相等的原因。尝试将您的 printf
更改为以下内容,它们应该更有意义:
printf("\n%d\t%p\t%p\n",(temp)->data,temp,&temp);
printf("\n%p\t%p\t%p\t\n\n%p\n\n\n",*head,
(*head)->next,head,&head);
请注意,我删除了参数 *temp
和 **head
,因为它们指的是实际的 struct node
,printf
无法处理。
在您的代码中,行 *head = temp
使 *head
始终与 temp
相同。
函数pushList()
总是在链表的开头添加新元素,head
一直指向链表的第一个元素。所以,显然 *head
等于 temp
因为 temp
指向最后分配的元素,将在开头插入。
顺便说一句,有一种更好的打印变量地址的方法,即使用 %p
而不是 %ld
,这将使您的程序更具可移植性。