2012-04-15 29 views
0

私はmalloc配列へのポインタの配列への順に、構文がなければならないことを知っている:(int型**)はmalloc(はsizeof(int型*))

誤っ
(int**)malloc(numberOfDesiredElements*sizeof(int*)) 

、私はnumberOfDesiredElements*を置くことを忘れてしまいましたサイズの前にランダムなセグメンテーション違反を投げつける私のプログラムを台無しにしていました。つまり時にはプログラムが正しく出力されることもありました。

私が望むスロットの数を指定しなかったときに何が起こったのか説明できますか?

ありがとうございます!

+1

構文はそうであってはいけません。不要なキャストは避けてください。 –

+0

どのようにキャストする必要はありませんか? – Krzysiek

+2

'malloc'は暗黙的に' int ** 'に変換できる' void * 'を返します。 mallocのプロトタイプがない場合、明示的なキャスト_may_はエラーを隠します。 –

答えて

4

これは単なる通常の乗算​​であり、魔法の構文ではありません。それは、それを書くのより良い方法が読み

int **p = malloc(numberOfDesiredElements * sizeof *p); 

、クリーナー容易になるだろう1の代わりに、3

+0

それは乗算ですか?ああ... T_Tランダムなsegフォールトはどうですか? – Krzysiek

+0

@Rafcio: 'malloc(sizeof(int))'と言うと、ちょうど1つのintに対して十分なメモリが得られます。複数のものをそこに埋め込もうとすると、未定義の動作領域になります。何かが起こる可能性があります。 (そして、これを避けるために 'calloc'を使います。) – Mat

+0

3のためのスペースがあると仮定していて、1のスペースしかないと仮定していたら、何か他のもの(ポインタを壊す可能性があります)は全く割り当てられなかった(segfault)。 – geekosaur

3

のためのスペースが割り当てられ、あなたはまっすぐあなたのタイプを維持する心配する必要はありません。 sizeof発現。キャストは不要です(CではC++では必須ですが、C++ではmallocを使用しないでください)、mallocのプロトタイプがスコープ内にない場合は、有用な診断を抑制できます。

あなたが意図したよりも少ないスペースを割り当てたときに起こったことは、定義された振る舞いの範囲を超えました。あなたが何か重要なものを掴んだら、ランタイムエラーが発生します。あなたがしなかった場合、あなたのコードが正しく動作するように表示されます。

+1

+1 'sizeof * p' ... - 可読性に関しては、私は' sizeof(* p) 'が好きです。 – alk

関連する問題