4

C++ クラス Foo があり、次のように言うとします。

Foo* foos = new Foo[SOME_CONSTANT];
memset(foos, 0, sizeof(Foo)*SOME_CONSTANT);
//or the bzero equivalent

Foo には data member がありBar* barPtrます。上記の操作は、barPtr が NULL になることを保証しますか? (つまり、ゼロ)。これがmemsetに当てはまらないgdbのケースに遭遇しました。その理由が知りたいです。

上記がおそらく悪い習慣であることは知っていますが、好奇心を求めています。

memset でsizeof(Foo )*SOME_CONSTANT を実行していたので、余分な があることに気付きました...

4

2 に答える 2

4

一方では、実装定義です。memsetまたはbzero、ポインター値をすべてゼロのビット パターンで埋めます。これは、特定のプラットフォームでの null ポインターの物理表現であることが保証されていません。有効なポインター値を生成することさえ保証されていません。つまり、アクセス時に未定義の動作をトリガーする、いわゆるトラップ表現になる可能性があります。

一方、bzeroPOSIX仕様の一部です(または以前はそうでした)。メモリが機能する場合、POSIX では null ポインターをすべてゼロのビット パターンで表す必要があります (または、少なくとも要求するために使用されていました)。つまり、POSIX システムでは、実際にポインターを null に設定します。

しかし、繰り返しになりますが、POSIX によって提供される保証は、私の回答の最初の部分で言及された実装固有のプロパティの単なる例です。言語 (C または C++) は、そのような保証を提供しません。

于 2012-11-02T00:34:53.093 に答える
3

いいえ。ヌル ポインターの表現は、すべてのビットがゼロである必要はありません。

comp.lang.c FAQセクション 5質問 7.31を参照してください。

于 2012-11-02T00:30:38.300 に答える