正如 dirkgently 所说,不要malloc()
在 C 中返回,这样做是没有用的,并且可以隐藏错误。
此外,为了计算 Node 标头之后的地址,我发现这样做更简洁:
t->data = t + 1;
这是有效的,因为t
它是一个类型化的指针,所以它的算术工作正常。加一会使它增加指向数据的大小,即sizeof (Node)
在这种情况下。对于这种特殊情况,我发现这种用法习惯用法,即在刚编辑的东西之后立即计算地址malloc()
(当那个“东西”是一个具有静态已知大小的明确定义的类型Node
,当然在这种情况下是结构)。
这有以下好处:
- 没有重复类型名称。
- 不
sizeof
,这么短。
- 再次,没有演员表。
- 涉及非常简单的算术,易于阅读。
Node
我意识到您在正确声明类型之前使用该类型也存在错误。我不同意 dirkgently 的解决方案,这是它在 C 中的外观:
/* This introduces the type name "Node", as an alias for an undefined struct. */
typedef struct Node Node;
struct Node {
Node *next; /* This is OK, the compiler only needs to know size of pointer. */
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;
}
而已。注意在调用中sizeof
对指针目标malloc()
的使用,以避免重复类型名称并在类型应该改变时产生易于忘记的依赖关系。