K&R"C编程语言"第2版在第131页上给出了一组变量,因此:
struct rect r, *rp = &r;
其中:
struct rect {
    struct point pt1;
    struct point pt2;
};
和
struct point {
    int x;
    int y;
}
然后这四个表达式是等价的:
r.p1.x
rp->pt1.x
(r.pt1).x
(rp->pt1).x
在同一页面的早些时候,我们看到:
p->member_of_structure
其被描述为"指特定成员".
我将连字符改为下划线,以确保我们不会与减号混淆.
太棒了,我可以看到我们将其称为嵌套结构,因为struct rect包含一个结构点.
那么rect的定义是什么,pt1和pt2都是指向结构点的指针?
这是我用以下代码位来解决问题的地方:
typedef struct some_node {
    struct timespec *tv;
    struct some_node *next;
} some_node_t;
显然我会在这里制作一个链表,这没问题.
这是一个非常大的问题:
struct timespec some_tv;
clock_gettime( CLOCK_REALTIME, &some_tv )
/* set up the head node */
struct some_node *node_head =
                ( struct some_node * ) malloc( sizeof( some_node_t ) );
node_head->tv = calloc ( (size_t) 1, sizeof ( struct timespec ) );
这一切都很好,我得到的node_head就好了.我甚至得到我的嵌套struct timespec node_head-> tv就好了.
什么是真正的问题是试图弄清楚如何将内部tv.sec设置为some_tv.sec中的值,如下所示:
((struct timespec *)(*node_head.tv)).tv_sec = some_tv.tv_sec;
我收到一个错误:
line 22: error: left operand of "." must be struct/union object
所以我在K&R看,我看到书中的例子没有指向struct rect中结构的指针.
我已经使用反复试验来获得我想要的东西,但这令人抓狂.我可以创建一个类型为"struct timespec temp"的临时变量,然后设置temp =&node_head.tv ...但是没有...这将无效.我想这会更糟糕.
答案很简单,当然,只需使用foo-> bar-> here语法.
修改代码以删除malloc上的强制转换并使用正确的语法:
/* set up the node list */
struct some_node *node_head =
                calloc( (size_t) 1, sizeof( some_node_t ) );
node_head->tv = calloc ( (size_t) 1, sizeof ( struct timespec ) );
node_head->tv->tv_sec = some_tv.tv_sec;
node_head->tv->tv_nsec = some_tv.tv_nsec;
node_head->next = NULL;
调试器确认了这一点:
(dbx) print *node_head
*node_head = {
    tv      = 0x1001453e0
    next    = (nil)
}
(dbx) print *node_head.tv
*node_head->tv = {
    tv_sec  = 1363127096
    tv_nsec = 996499096
}
效果很好.显然,我需要咖啡.:-)