12
#include <stdio.h>

int main()
{
  printf("%d", sizeof(struct token *));
}

以上代码可以在Linux下使用gcc编译链接。你们中的任何人都可以向我解释幕后的事情吗?我知道重点是固定内存大小,因此结构标记与 sizeof 无关,但即使在 gcc 中打开警告选项,也根本没有关于“不存在”结构的警告。问题的上下文是我正在阅读其他人的一些源代码,我正在非常努力地找到“结构令牌”的定义,但当然失败了。

4

2 回答 2

12

因为您正在尝试获取指向struct token. 指针的大小不取决于结构的实际定义方式。

通常,您甚至可以声明一个类型为 的变量struct token*,但不能取消引用它(例如,通过指针访问成员)。

于 2012-05-25T08:29:19.813 回答
9

套用 C 标准,不完整类型是描述对象但缺少确定其大小所需信息的类型。

void 是另一种不完整的类型。与其他不完整类型不同,void 无法完成。

这种“不完整类型”通常用于各种句柄:库允许您为某物分配一个“句柄”,使用它并再次处理它。所有这些都封装在库中。作为用户,您不知道里面会发生什么。

例子:

lib.h:

struct data * d_generate(void);
void d_set(struct data *, int);
int d_get(struct data *);
void d_free(struct data*);

lib.c:

#include "lib.h"
#include <stdlib.h>
struct data { int value; };
struct data * d_generate(void) {
    return malloc(sizeof(struct data))
}
void d_set(struct data * d, int v) {
    d -> value = v;
}
int d_get(struct data * d) {
    return d->value;
}
void d_free(struct data* d) {
   free(d);
}

用户.c:

#include "lib.h"
[...]
struct data * d = d_generate();
d_set(d, 42);
int v = d_get(d);
// but v = d->value; doesn't work here because of the incomplete definition.
d_free(d);
于 2012-05-25T08:33:34.180 回答