23

私は、これら3つすべてが異なる意味を持っていることを認めます。しかし、私はこれらのそれぞれがどの特定のインスタンスに適用されるのか理解していません。誰かがこれらのそれぞれの例を共有できますか?ありがとうございました。

       malloc(sizeof(int))
       malloc(sizeof(int *))
(int *)malloc(sizeof(int))
4

2 に答える 2

48

malloc(sizeof(int))を格納するためにヒープからスペースを割り当てていることを意味しますintint必要な 数のバイトを予約しています。これにより、キャストする必要のある値が返されますint *。(へのポインタint。) 一部の人が指摘しているように、Cでの一般的な方法は、暗黙のキャストでこれを処理することです。

malloc(sizeof(int*))へのポインタを格納するためにヒープからスペースを割り当てていることを意味しますint。ポインタが必要とする数のバイトを予約しています。これにより、にキャストする必要のある値が返されますint **。(へのポインタへのポインタint。)

(int *)malloc(sizeof(int))は最初の呼び出しとまったく同じですが、結果は明示的に。へのポインターにキャストされますint

多くのアーキテクチャでは、anintはポインタと同じサイズであるため、これらは(誤って)すべて同じものに見えることに注意してください。つまり、誤って間違ったことを実行しても、結果のコードが機能する可能性があります。

于 2013-03-05T05:52:16.373 に答える
9

最も確実な構文パターンは次のとおりです。

 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...
于 2013-03-20T15:10:04.543 に答える