これら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
へのポインターに明示的にキャストされます。
多くのアーキテクチャでは、int
はポインタと同じサイズであるため、これらは(誤って)すべて同じように見えることに注意してください。つまり、誤って間違ったことをしても、結果のコードが引き続き機能する可能性があります。
最も確実な構文パターンは次のとおりです。
_ int *p;
p = malloc (cnt * sizeof *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...
_