#include <stdio.h>
int main()
{
printf("%d", sizeof(struct token *));
}
Run Code Online (Sandbox Code Playgroud)
上面的代码可以在Linux下使用gcc编译和链接.你们中的任何人都可以向我解释场景背后的事情吗?我知道重点是内存的修复大小,所以struct token与sizeof无关,但是甚至打开gcc中的警告选项,根本没有关于"none exists"结构的警告.这个问题的上下文是我正在阅读其他人的一些源代码,我正在非常努力地找到"struct token"的定义,但当然失败了.
Ale*_*lin 12
因为你正在试图获得的大小指针来struct token.指针的大小不依赖于结构的实际定义方式.
通常,您甚至可以声明类型的变量struct token*,但不能取消引用它(例如,通过指针访问成员).
为了解释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*);
Run Code Online (Sandbox Code Playgroud)
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);
}
Run Code Online (Sandbox Code Playgroud)
user.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);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
868 次 |
| 最近记录: |