web-dev-qa-db-ja.com

malloc(sizeof(int))vs malloc(sizeof(int *))vs(int *)malloc(sizeof(int))

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

       malloc(sizeof(int))
       malloc(sizeof(int *))
(int *)malloc(sizeof(int))
21
sabergeek

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

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

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

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

42
Steven Burnap

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

_ 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...
_
6
wildplasser