2011-08-17 11 views
1
struct s 
{ 
    int i; 
    char * c; 
} *obj; 
obj = malloc(sizeof(struct s)); 

たとえば、私たちは上で定義した構造体(または一般的な構造体)を持っているとします。sizeof演算子と構造体

はsizeof(構造体S)またははsizeof(* OBJ)sizeof演算子を使用した場合

はその後、より良い何ですか?それは私のような(論理的なエラーを導入可能な第2のいずれかを使用し、また

(明らかに、我々は構造体sのオブジェクトのためのメモリを割り当てていることを教えてくれる)に、より理にかなっているので

は、私が最初のものを好みます通常の「ポインタの逆参照を忘れる」)

最初に問題が発生する可能性はありますか? 私はまだそれに問題はなかったが、ちょうど私がやっていることが適切かどうかを知りたかった。

もしそうなら、失敗する可能性のある例を教えてください。

+0

「建設的でない」と投票された理由は分かりません。これは良い質問です。 –

+0

["C" sizeof型または変数の可能な複製](http://stackoverflow.com/questions/373252/c-sizeof-with-a-type-or-variable) –

答えて

3

を用いることができる。 objの種類がこれまでに変更した場合、これはまだ動作しますので、

sizeof(*obj)常に、しかし、使用すべきです。 sizeof(struct s)を使用すると、潜在的なバグが発生します。

+0

はい、私の方法に欠陥があります。構造体名を変更すると、少なくともエラーは吐き出されますが、型を変更することは、世話をしなければ悲惨です。私は今からオブジェクトに固執すると思います。ありがとうございました。 –

7

はsizeof(構造体S)またははsizeof(* OBJ)sizeof演算子を使用している場合その後、より良い何ですか?

これは優先事項です。

sizeof(*obj)が好ましい。後でタイプがobj(たとえば、struct s2)に変更された場合は、sizeof(struct s)が期限切れになります。

+1

私は 'sizeof(* obj ) '(sizeof'は演算子であり関数ではないので)括弧はオプションであるため(sizeof * objはむしろ良いと思うので) –

-2

構造名が変更されたにもかかわらず、コードの期限が切れていても、私はsizeof(struct s)を好んでいます。構造が変わったら、私の考え方は変わります。それを使うコードを安全面に改造するのが最善です。

+0

-1: 'sizeof(* obj)'が常に優先されるべきです。 'obj'の* type *が変わった場合、' sizeof(struct s) 'のサイレントバグがあります。 –

関連する問題