《C程序设计语言》第二版K&R在第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
这里“refers to the particular member”描述了特定成员。
我将连字符改为下划线,以确保我们不会与减号混淆。
非常好,我可以看到我们有一个嵌套的结构体,因为结构体rect包含一个结构体point。
如果定义rect时pt1和pt2都是指向结构体point的指针怎么办?
这就是我在以下代码片段中遇到问题的地方:
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 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
}
很好用。明显我需要咖啡。 :-)
malloc
的结果... - Oliver Charlesworth