最近、構造体に動的にメモリを割り当てる必要がある割り当てがありました。私はこの方法を使用しました:
myStruct *struct1 = malloc(sizeof *struct1);
これはうまくいきました。しかし、その方法がわかりません。struct1
その時点ではポインタは初期化されていないので、サイズは何もないはずだと思います。したがって、malloc(sizeof *struct1)
割り当てる有効な量のメモリをどのように返すのでしょうか。
sizeof
Cの演算子はオペランドを評価しません。タイプを見るだけです。例えば:
#include <stdio.h>
int main(void)
{
int i = 0;
printf("%zu\n", sizeof i++);
printf("%d\n", i);
return 0;
}
上記のプログラムを実行すると、それi
はまだ0であることがわかります。
したがって、あなたの例で*struct1
は、評価されず、型情報にのみ使用されます。
malloc(sizeof(*struct1))
宣言した構造体変数の数に応じて、構造体のサイズに等しい量のメモリを割り当てます。Sizeofは、コンパイル時に検出されるstruct1のサイズを返すために使用されます。
これを試してみてください。最初に構造を宣言し、
typedef struct {
int a;
int b;
int c;
}MyStruct;
次に、メモリを割り当てる前に、1つの構造変数を初期化し、指定されたとおりにメモリを割り当てます。
MyStruct test;
printf("~~~~~ sizeofStruct: %ld", sizeof(test));
MyStruct *myAlloc = (MyStruct *)malloc(sizeof(test));
printf("~~~~~ sizeofmyAlloc: %ld", sizeof(*myAlloc));
乾杯 !