私は、これら3つすべてが異なる意味を持っていることを認めます。しかし、私はこれらのそれぞれがどの特定のインスタンスに適用されるのか理解していません。誰かがこれらのそれぞれの例を共有できますか?ありがとうございました。
malloc(sizeof(int))
malloc(sizeof(int *))
(int *)malloc(sizeof(int))
私は、これら3つすべてが異なる意味を持っていることを認めます。しかし、私はこれらのそれぞれがどの特定のインスタンスに適用されるのか理解していません。誰かがこれらのそれぞれの例を共有できますか?ありがとうございました。
malloc(sizeof(int))
malloc(sizeof(int *))
(int *)malloc(sizeof(int))
malloc(sizeof(int))
を格納するためにヒープからスペースを割り当てていることを意味しますint
。int
必要な 数のバイトを予約しています。これにより、キャストする必要のある値が返されます 一部の人が指摘しているように、Cでの一般的な方法は、暗黙のキャストでこれを処理することです。int *
。(へのポインタint
。)
malloc(sizeof(int*))
へのポインタを格納するためにヒープからスペースを割り当てていることを意味しますint
。ポインタが必要とする数のバイトを予約しています。これにより、にキャストする必要のある値が返されますint **
。(へのポインタへのポインタint
。)
(int *)malloc(sizeof(int))
は最初の呼び出しとまったく同じですが、結果は明示的に。へのポインターにキャストされますint
。
多くのアーキテクチャでは、anint
はポインタと同じサイズであるため、これらは(誤って)すべて同じものに見えることに注意してください。つまり、誤って間違ったことを実行しても、結果のコードが機能する可能性があります。
最も確実な構文パターンは次のとおりです。
int *p;
p = malloc (cnt * sizeof *p);
この構文では、* pのタイプ(および/またはサイズ...)が変更された場合でも、コードを変更する必要はありません。
struct mysstruct *q;
q = malloc (cnt * sizeof *q);
次のような問題を回避します
struct mysstruct *z;
z = malloc (cnt * sizeof(struct hisstruct)); // Auch!
、プラス:sizeof expr
フォームも短くなります。
p = malloc(CNT * sizeof *p)
更新:このテストプログラムの正しさを実証するために:
#include <stdio.h>
#include <stdlib.h>
struct mystruct {
int i;
char s[14];
};
int main(void)
{
struct mystruct *p;
size_t siz;
siz = sizeof p;
printf("Sizeof p := %zu\n", siz);
siz = sizeof *p;
printf("Sizeof *p := %zu\n", siz);
printf("Allocating %zu (%u structs, each of size %zu) bytes to be assigned to p...\n"
, 10u * sizeof *p
, 10u, sizeof *p
);
p = malloc(10 * sizeof *p);
return 0;
}
ここで出力するもの:
Sizeof p := 8
Sizeof *p := 20
Allocating 200 (10 structs, each of size 20) bytes to be assigned to p...