2009-06-04 8 views
51

明示的にmalloc()の戻り値をキャストする必要がありますか?

の戻り値の型は void*なので、 mallocが返すポインタは char*型に暗黙的にキャストされてからtempに代入されますか?この点でスタンダードは何を言いますか?

ポインタ変数がいくつかのstruct型の場合:

struct node *temp; 
temp = (struct node *)malloc(sizeof(struct node)); 

struct node*型にキャストせずにtempにメモリを割り当てると、暗黙的にstruct node*型にキャストされるか、明示的にキャストする必要がありますそれはstruct node*タイプに?

+7

CコンパイラではなくC++コンパイラでコードをコンパイルする必要がある場合は、キャストが必要です。その結果、私のコードのほとんどは、純粋なCがそれを必要としなくても、明示的なキャストを含みます。私は通常その理由を示すために/ * = C++ = * /とタグ付けします。 –

+0

私が必要とするわけではありませんが、少し後でコードを読むのに役立ちます。 – Xolve

+2

[この質問](http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc/605858#605858)も参照してください。 – unwind

答えて

33

Cの無効ポインタは、明示的キャストなしで任意のポインタに割り当てることができます。

+9

私はそれが関数ポインタに当てはまるとは思わない。 –

+11

Cは、関数ポインタを非関数ポインタにキャストできるかどうかにかかわらず、未定義のままにします。 C++はそれを明示的に禁じており、C++ 1xは条件付きでそれをサポートしています –

+10

POSIX(少なくとも2008)では、関数ポインタはデータポインタと同じサイズでなければなりません。 –

10

Cはvoid*から暗黙的にキャストされるため、キャストは自動的に行われます。 C++の変換では、からvoid*が暗黙的に行われ、他の方向では明示的なキャストが必要です。

+2

注意C++では、キャストなしのvoid *への変換がサポートされています。 –

3

C++では、明示的にキャストする必要がありますが、これは本当にあなたにそれを伝えるための言葉です。
Cでは、キャストする必要はまったくありません。メモリはちょうどメモリです。最新のC標準が必要かどうかを調べる必要があります。

+2

C99規格はキャストを必要としません。 –

49

"自分自身を繰り返さない"の考え方が好きなら、malloc()コールで、変数の宣言から型名を繰り返す必要はないということが魅力的です。あなたが指摘しているように、ポインタはvoid *に変換されますが、関数ポインタは例外ではありません。

さらに、sizeofのいずれかを使用して自分自身を繰り返す必要はありません。構造を割り当てるとき、あなたの第二の例は、次のように書くことができます。私のように謙虚でない意見で

struct node *temp; 
temp = malloc(sizeof *temp); 

最高方法です。

あなた自身を繰り返すことを避けることは、あなたが書き込むものの数を減らし、その結果、それらのものが間違っているというリスクを減らします。

sizeof引数のアスタリスク(これは「struct nodeのサイズ」と同じですが、タイプ名を繰り返さずに「このポインタが指すオブジェクトのサイズ」を意味します)に注意してください。これは、sizeofが、その引数である式のサイズを(コンパイル時に!)計算するためです。この場合。 sizeof 3がタイプintの式のサイズを計算するのと同様に、sizeof *tempstruct nodeのインスタンスのサイズを計算します。

何か、つまり変数名自体を繰り返しますが、これはしばしば簡単な表現であり、簡単に行えるようになり、コンパイラがエラーを見つけやすくなります。

+6

+1 sizeof * temp – diapir

+3

これは、DRYを適用することが安全でないプログラミング手法である場合の1つのインスタンスです(後のリンクを参照)。反復を避けるということは、エラーを減らすという議論は文脈的なものである。曖昧さのために悪名高いCのポインタについては、それは悪いjujuにつながるでしょう。私はむしろ冗長で、コンパイル時に(実行時とは対照的に)問題を見つけるためにキャストを繰り返す:https://www.securecoding.cert.org/confluence/display/seccode/MEM02-C.+Immediately+cast+ + result + of + a + memory + allocation + function + call + into + a + pointer + to + the + allocated + type –

+3

いつものように、securecoding.cert.orgはいたずらにいっぱいです。あるいは、もっと丁寧に言えば、私がそのサイトで読んだすべての記事は、間違った情報( 'ftell'と' fstat'のことを考えてください)、悪く有害であると広く認められているスタイル、カーゴカルト "セキュリティ"プログラミング。 –