4

配列/ポインターを定義した場合、友人の1人と議論していました。

sometype * p;

型のサイズを知りたい場合は、次を使用する必要があると彼は言いました。

sizeof(sometype)

私は次のものも使用できると言いました:

sizeof(p[0]),

それは同じであるべきです。彼は同意しませんでした。彼の要点は、pが初期化されていない場合、この使用法がp[0]問題を引き起こす可能性があるということです。

しかし、私の知る限りでは、 の値を変更または依存する場合にのみ、p[0]これが有害になります。の値を変更しp[0]たり使用したりしないためp[0]、これは完全に理にかなっています。

お互いに説得できないので、誰かこのコンセプトを明確にしてくれませんか。

私はこの質問が役に立たないことを知っており、私を含むほとんどすべての開発者が sizeof(sometype) を使用します:)。しかし、この質問は楽しいものであり、 sizeof(p[0]) が有害になる場合があるかどうかを知りたいと思っています。

=================================
この質問を少し拡張させてください。無関係な値を使用した場合(またはランダムなどと見なされた場合)。常にp[0]値を取得するために使用できますか?

質問をより明確にするために、初期化されていないポインターの値を変更しない場合、それが指している値を使用するだけで、問題を引き起こさずに常に値を取得できますか?

4

4 に答える 4

10

への引数sizeofは評価されていないオペランドであるため、ポインタの逆参照などは有効なメモリを参照する必要はありません。純粋に型情報に基づいています。

(当然のことながら、sizeof *pポリモーフィックではなく、静的型のみを使用します。)

于 2012-12-26T15:58:11.147 に答える
8

sizeofコンパイル時に評価されるため、メモリが初期化されているかどうかは関係ありません。これは実行時のことだからです。

または - 配列のように見えないのでsizeof p[0]、さらに良いと思います -sizeof *pを使用するときに型を再度入力することを避けるための優れた方法sizeofです。

于 2012-12-26T15:57:00.107 に答える
7

C ++言語では、の引数がsizeof評価されることはありません。つまり、引数式で使用される変数が有効な値を保持しているかどうかはまったく関係ありません。重要なのは式の静的タイプのみでありsizeof、コンパイル時に決定されます。

sizeofさらに、コードをより型に依存しないようにするために、引数として(型名ではなく)式を使用することが実際には望ましいです。

Cでは、引数式が評価される場合(可変長配列)がありますが、C++では評価されません。

于 2012-12-26T16:00:11.863 に答える
2

sizeof() はコンパイラによって評価されるため、初期化されていない変数は問題になりません。

于 2012-12-26T15:57:12.993 に答える