#include <stdlib.h>
struct timer_list
{
};
int main(int argc, char *argv[])
{
struct foo *t = (struct foo*) malloc(sizeof(struct timer_list));
free(t);
return 0;
}
为什么上面的代码段编译(在 gcc 中)并且在我没有定义 foo 结构时可以正常工作?
因为在上面的代码片段中,编译器不需要知道 的大小struct foo
,只需要知道指向 的指针的大小struct foo
,这与结构的实际定义无关。
现在,如果你写过:
struct foo *t = malloc(sizeof(struct foo));
那将是一个不同的故事,因为现在编译器需要知道要分配多少内存。
此外,如果您尝试访问 a 的成员struct foo*
(或取消引用指向 foo 的指针):
((struct foo*)t)->x = 3;
编译器也会抱怨,因为此时它需要知道x
.
顺便说一句,此属性对于实现不透明指针很有用。
“那么 free(t) 呢?编译器可以在不知道结构实际大小的情况下释放内存吗?” 不,编译器不会释放任何东西。Free() 只是一个输入参数为 void * 的函数。