2016-07-12 6 views
1

私はプログラムでこの行を見たC.に新しいです:sizeof(int **)はどういう意味ですか?

grid = calloc(nx,sizeof(int**)); 

私はint**がポインタへのポインタを意味しますが、何がsizeof(int**)を意味していることを読んで?

+3

grid = calloc(nx, sizeof *grid); 
のように書き換えることができる次いで

int ***grid; 

として宣言されている[このようにタフでしたか?](https://en.wikipedia.org/wiki/Sizeof ) –

+0

@ EOF私の日にエンターテインメントを追加していただきありがとうございます。 –

+0

@EOF: "* ...はNULLがビット単位でゼロでなければならないと仮定しています。*"あなたはこれを締結していますか?私は何が欠けていますか? :-S – alk

答えて

1

sizeof(int **)は、int *の数がsizeof(int *)の場合と同様に、int **のバイト数を示します。彼らは間接的に異なるレベルを持っています。

+0

sizeof(int **)= sizeof(int *)と言うのは正しいですか?どちらの場合でもメモリにアドレスを入れるだけで済みます。 また、intと**の間にスペースを入れても違いはありますか? 助けてくれてありがとう – secluded

+3

@secluded:いいえ、 'int *'と 'int **'が同じ量の記憶域を必要とすることは保証されていません。ほとんどの現代のアーキテクチャではそうですが、それは普遍的に真実である必要はありません。 –

+2

しかし実際にはそうである必要はありません。標準は同じでなければならないとは言いません。 – dbush

2

sizeofの式は、ポインタポインタを表すのに必要なバイト数だけです。intです。おそらく、コードを書いた人は、そのようなポインタnxを格納するのに十分なメモリを割り当てようとしています。

3

オペレータsizeof演算子は、オペランドに必要な記憶領域のバイト数を返します。オペランドは、式またはカッコで囲まれた型のいずれかです。この場合、オペランドはタイプint **であり、これは「intへのポインタへのポインタ」です。 gridを仮定

+0

Nit: "* ..この場合、オペランドは 'int **'型です*実際には、その型としてサイズを取るべきですが、オペランドは '(int **)'です。 – alk

+0

応答ありがとう! 'grid'は' int *** grid'として宣言すべきという結論にどうでしたか?この宣言が何を意味するのかを説明できるなら、本当に感謝します。あなたが正しいです、私はこの宣言を自分のコードで見つけました! – secluded

+1

@secluded: 'malloc'または' calloc'を通して 'T '型のオブジェクトを動的に割り当てるときは常に、結果のポインタを' T * '型のオブジェクトに割り当てます。 'int'のブロックを割り当てると、その結果を' int * 'に代入します。 'int *'のブロックを割り当てると、その結果を 'int **'に代入します。そして 'int **'のブロックを割り当てると、その結果を 'int ***'に代入します。 –

関連する問題