GDB点运算符引用指针?

Eug*_*ffe 2 c gdb pointers double-pointer

在使用 GDB 进行调试时,我注意到一些非常奇怪的事情。即, . 运算符在打印语句中使用时,可以像 -> 运算符一样取消引用单个甚至双指针以获取结构的字段。

这是一个简单的例子:

#include <stdio.h>

typedef struct node {
    struct node *next;
    int data;
} Node;

int main()
{
    Node head, *head_p, **head_pp;

    head.next = 0UL;
    head.data = 42;

    head_p = &head;
    head_pp = &head_p;

    // **GDB PAUSED HERE**
    printf("head.data: %d\n", head.data);
    
    // These won't compile because the . operator is misused
    //
    // printf("head_p.data: %d\n", head_p.data);
    // printf("head_pp.data: %d\n", head_pp.data);
         
}
Run Code Online (Sandbox Code Playgroud)

这是 GDB 在暂停时打印的时间printf:

GDB 输出

怎么可能。运算符(在 GDB 打印语句中)取消引用这样的指针??

谢谢!

the*_*bee 5

GDB 命令的语法不是 C。表达式是在模块的语言上计算的,在你的情况下是 C/C++。

该文件说:

., ->
结构成员和指向结构成员的指针。为方便起见,GDB 将两者视为等价的,根据存储的类型信息选择是否取消引用指针。在结构和联合数据上定义。