K&R“The C Programming Language”第 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
这被描述为“指特定成员”。
我将连字符改为下划线,以确保我们不会与减号混淆。
太好了,我可以看到我们有我所说的嵌套结构,因为结构 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 很好。我什至得到我的嵌套结构 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,我发现书中的示例没有指向结构 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
}
效果很好。显然,我需要咖啡。:-)