c-打印链接列表的地址



如何输出变量*headtemp的值。

#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 = %ldn"
           "temp->data = %dn"
           "temp = %ldn"
           "&temp = %ldn", *temp, (temp)->data, temp, &temp);
    printf
        ("*head = %ldn"
         "**head = %ldn"
         "(*head)->next = %ldn"
         "head = %ldn"
         "&head = %ldn", *head, **head, (*head)->next, head, &head);
}
int main()
{
    struct node *head = NULL;
    printf("&head = %ldn", &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如何显示为010292624,而不是12

此外,您对大多数字段使用了错误的输出说明符(尽管根据体系结构的不同,结果可能是正确的,但它是不可移植的(。试着在编译器上打开警告级别(对于gcc,-Wall会向您发出一系列警告(。您应该有选择地将指针强制转换为void*并使用%p说明符。

这(具体地说,将struct node s传递给printf(使*head&temp相等。尝试将printf更改为以下内容,它们应该更有意义:

printf("n%dt%pt%pn",(temp)->data,temp,&temp);
printf("n%pt%pt%ptnn%pnnn",*head,
(*head)->next,head,&head);

注意,我删除了参数*temp**head,因为它们指的是printf无法处理的实际struct node

在代码中,*head = temp行使*head始终与temp相同。

函数pushList()总是在链表的开头添加新元素,head总是指向链表的第一个元素。因此,显然*head等于temp,因为temp指向将在开始处插入的最后分配的元素。

顺便说一句,有一种更好的方法可以打印变量的地址,那就是使用%p而不是%ld,这将使您的程序更具可移植性。

相关内容

  • 没有找到相关文章

最新更新