正如dirkgently所说,在C语言中不要对malloc()
的返回值进行类型转换,这样做是无用的,并且可能会隐藏错误。
此外,为了计算Node头之后的地址,我发现像这样做更加简洁:
t->data = t + 1;
这个方法可行是因为
t
是一个有类型的指针,所以在它上面进行算术运算是没问题的。加1会增加所指向数据的大小,即在这种情况下是
sizeof (Node)
。我发现在这特定的情况下这种用法很惯用,用于计算刚刚被
malloc()
分配之后的地址(当“something”是一个定义良好、大小静态已知的类型时,如此例中的
Node
结构体)。
这样做有以下几个好处:
- 没有重复的类型名称。
- 没有
sizeof
,所以代码更短。
- 再次强调,没有强制类型转换。
- 参与的算术运算非常简单,易于阅读。
我意识到在正确声明
Node
类型之前使用它有错误。我不赞同dirkgently的解决方案,以下是C语言中应该如何书写:
typedef struct Node Node;
struct Node {
Node *next;
void *data;
};
为了完整起见,并且由于我从不厌倦展示我认为应该如何编写此类代码,这里提供一个创建一个新节点来保存n个字节数据的函数的示例:
Node * node_new(size_t n)
{
Node *node;
if((node = malloc(sizeof *node + n)) != NULL)
{
node->next = NULL;
node->data = node + 1;
}
return node;
}
就是这样。注意在malloc()
调用中对指针目标使用sizeof
,以避免重复类型名称并使易于忘记的依赖关系(如果类型发生更改)。