链表中节点的地址与节点存储的数据的地址是否相同?
链表节点地址与节点数据地址的对应关系
答案取决于链表节点的具体实现逻辑,分两种常见情况:
- 数据地址与节点首地址一致的场景
这种情况最常见于C/C++的裸结构体实现,且数据域被定义为结构体的第一个成员。举个例子:
C语言标准明确规定,结构体变量的首地址和其第一个成员的地址完全相等,所以如果指针指向的节点首地址是216,那么val的地址也为216,和节点地址一致。struct ListNode { int val; // 数据域放在结构体最开头 struct ListNode *next; }; - 数据地址与节点首地址不一致的场景
只要不符合上面的条件,地址都会出现偏移,常见的场景包括:- 结构体定义中指针域放在数据域前面:比如把
next指针放在val前面定义,那么val的地址就是节点首地址加上指针类型的长度(32位系统加4字节,64位系统加8字节) - 带额外元数据的实现:比如C++的带虚函数的类、Java/Python等面向对象语言的对象,开头会存储虚函数表指针、GC标记、类型信息等额外数据,哪怕类的第一个成员是数据,地址也会和对象首地址有固定偏移
- 特殊链表的自定义节点:比如带访问计数、节点长度等附加信息的节点,这些附加字段如果放在数据域前面,也会导致数据地址不等于节点首地址
- 结构体定义中指针域放在数据域前面:比如把
内容的提问来源于stack exchange,提问作者Himani Singla
相关产品推荐
相关产品推荐

