我读到这个:同一内存地址上的两个不同值和这个:同一地址的变量如何产生 2 个不同的值? 但两者都是关于const
限定符的问题,所以我认为我的问题不同。
这是来自链表实现。head
是一个struct Node*
,而walker
,用于打印列表元素等,也是一个struct Node*
,初始化为struct Node* walker = head
。
奇怪的是,如果我用%d
格式打印出*head
(我的struct Node
是经典的int value
和struct Node* next
格式),我会得到1
,这就是我设置的第一个Node
的值。 但是,当我使用相同的%d
格式打印出*walker
时,我得到一些奇怪的十进制值,例如1525189360
。
但是,我检查head
和walker
具有相同的值,这是第一个Node
的地址,所以我真的不明白这种差异。
更诡异的是,如果我打印出head->value
,我又会得到1
,如果我打印出walker->value
,这次我也1
!
法典
struct Node {
int value;
struct Node* next;
};
struct Node n1;
n1.value = 1;
struct Node* head;
head = &n1;
struct Node* walker = head;
printf("address of walker: %p, address of head: %p, value in walker: %p
,value in head: %p, value pointed to by walker: %d, value pointed
to by head: %dn", &walker, &head, walker, head, *walker, *head);
打印输出:
address of walker: 0x7fff5ae88aa8, address of head: 0x7fff5ae88b00,
value in walker: 0x7fff5ae88af0, value in head: 0x7fff5ae88af0,
value pointed to by walker: 1525189360, value pointed to by head: 1
在printf
参数列表中,最后两个参数是*walker
和*head
。 它们都有类型struct Node
,当然它们是按值传递的。 没有printf
格式说明符可以适用于struct Node
,所以你会得到垃圾。
尝试打印结构的某个字段的值。 例如,您可以传递walker->value
和head->value
,并将格式说明符更改为%d
以打印int
值。