1
#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 结构时可以正常工作?

4

2 回答 2

7

因为在上面的代码片段中,编译器不需要知道 的大小struct foo,只需要知道指向 的指针的大小struct foo,这与结构的实际定义无关。

现在,如果你写过:

struct foo *t = malloc(sizeof(struct foo));

那将是一个不同的故事,因为现在编译器需要知道要分配多少内存。

此外,如果您尝试访问 a 的成员struct foo*(或取消引用指向 foo 的指针):

((struct foo*)t)->x = 3;

编译器也会抱怨,因为此时它需要知道x.


顺便说一句,此属性对于实现不透明指针很有用。

于 2013-01-08T14:34:37.083 回答
0

“那么 free(t) 呢?编译器可以在不知道结构实际大小的情况下释放内存吗?” 不,编译器不会释放任何东西。Free() 只是一个输入参数为 void * 的函数。

于 2013-01-08T15:07:10.020 回答