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;
}

foo 構造体を定義していないのに、上記のコード セグメントが (gcc で) コンパイルされ、問題なく動作するのはなぜですか?

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


余談ですが、このプロパティはOpaque Pointerを実装するのに役立ちます。

于 2013-01-08T14:34:37.083 に答える
0

「そして、free(t) はどうですか?コンパイラは、構造体の実際のサイズを知らなくてもメモリを解放できますか?」いいえ、コンパイラは何も解放しません。Free() は、入力パラメーター void * を持つ単なる関数です。

于 2013-01-08T15:07:10.020 に答える