3

重複の可能性:
ポインター (アドレス) が負になることはありますか?

memset を使用して構造体をすべて -1 に初期化することを検討しています (符号付きの数値を使用せず、ゼロが有効な値であるため)。

-1 は有効なポインター アドレスですか? 私のアイデアに他に問題はありますか?注: プラットフォームは linux/gcc/x86 です

PSすべてのポインターではなく、すべての無効な値に対してゼロが有効な構造体を初期化しようとしているため、オプションで1つの関数で部分的な初期化を行い、後で初期化されていないフィールドをデフォルト値に初期化できます。cでこれを行うパターン/戦略がある場合は?

4

4 に答える 4

3

のポインタとしての解釈-1はアーキテクチャに依存するため、信頼できません。

一般に、memsetポインターではなく、バイトを設定することを目的としています。C では、個々のバイトを組み合わせてポインターを作成する方法については保証しません。ソリューションが機能する場合でも、それが機能する方法と理由を文書化する必要があります。

NULLが有効な値である場合は、すべてのポインターを適切な型のセンチネルに設定することをお勧めします。したがって、構造にフィールドがある場合int *ip:

static const int sentineli;

// in the initialization:
foo->ip = (int *)&sentineli;

次に、その値と比較します。これは自己文書化です。

于 2011-03-21T11:39:07.863 に答える
3

一般に、有効なポインター値は NULL と、既存のオブジェクトの先頭、内部、および直後へのポインターのみです。また、NULL は必ずしも zero:s を含むビットパターンとして表現する必要はないことに注意してください。

一部のアーキテクチャでは、-1 が有効なポインター値です。一部のマイクロコントローラーには、メモリの下部に RAM があり、上部に読み取り専用メモリ (フラッシュなど) があります。

于 2011-03-21T11:47:48.227 に答える
1

負の数は通常、実装定義の方法で格納されます。1 の補数を使用して負の数を格納する実装もあれば、2 の補数を使用する実装もあります。

私のアイデアに他に問題はありますか?

コードは、実装間で移植できない場合があります。

于 2011-03-21T11:40:31.467 に答える
0

実際のデスクトップまたはサーバー システムでは、ポインターへの -1 キャストは、すべてビット 1 のポインター表現と同等であり、有効なポインターではありません。ポインターの加算が整数の加算として行われると仮定すると、ポインターpがすべてビット 1 の表現を持つ場合p+1、すべてビット 0 のポインターになり、現実の世界ではヌル ポインターになります。

それにもかかわらず、これは標準によって保証されていません。

于 2011-03-21T13:32:51.223 に答える