#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 で) コンパイルされ、問題なく動作するのはなぜですか?
上記のコード スニペットでは、コンパイラは のサイズを知る必要はなく、へのポインタstruct foo
のサイズだけを知る必要があるためです。これは、構造体の実際の定義とは無関係です。struct foo
さて、あなたが書いたなら:
struct foo *t = malloc(sizeof(struct foo));
コンパイラは割り当てるメモリの量を知る必要があるため、それは別の話です。
さらに、ある時点で a のメンバーにアクセスしようとした場合struct foo*
(または foo へのポインターを逆参照した場合):
((struct foo*)t)->x = 3;
この時点で の構造体へのオフセットを知る必要があるため、コンパイラも文句を言うでしょうx
。
余談ですが、このプロパティはOpaque Pointerを実装するのに役立ちます。
「そして、free(t) はどうですか?コンパイラは、構造体の実際のサイズを知らなくてもメモリを解放できますか?」いいえ、コンパイラは何も解放しません。Free() は、入力パラメーター void * を持つ単なる関数です。