这部分K&R(C语言书)让我深思:
从书中得知:
从书中得知:
struct tnode {
char *word;
int count;
struct tnode *left;
struct tnode *right;
};
节点的递归声明可能看起来有些冒险,但它是正确的。
因为tnode的定义并不使用tnode本身,而仅仅是指向tnode的指针,所以编译器给了我们一个免费通行证。但我想知道当tnode被声明时,计算机如何知道要分配多少内存?
sizeof(void *) >= sizeof(T *)
。 - Chris Lutzsizeof(void*) >= sizeof(T*)
。一个故意的恶意实现可以将未使用的填充字节放入非 void 指针中,或者更现实地考虑一个只有 24 位可寻址空间的 16/16 分段架构。然后,合法地,void*
可以被“压缩”为 3 个字节,而char*
是一个完整的 4 字节远指针(方便解引用)。实现者是否会费心去做另当别论,重点是许多奇怪的事情都是允许的,保证的是void*
可以保存任何对象的地址。 - Steve Jessopchar *
和void *
需要具有相同的表示形式。6.2.5¶26 "指向void
的指针应具有与指向字符类型的指针相同的表示和对齐要求。" - Chris Lutzint*
,哈哈。不过,如果一个char*
的格式难以解引用,那就特别奇怪了。我完全同意你的预测,即sizeof(void*) >= sizeof(T*)
,但据我所知,这只是常识而非标准的保证。 - Steve Jessop