2016-03-24 1 views
-3

私が知っているところから始めます:Cの標準では、理論的には何も指していない無効なポインタをNULLが参照することが必要です。したがって、たとえばmalloc()は、エラーが発生した場合にはNULLポインタを返すべきではありません。私はNULLがしばしば((void*)0)と表され、コンパイラはこのポインタゼロを、シンボリックなNULLポインタの理論上の必要条件を満たす実装定義済みのアドレスに変換することを知っています(本質的にアドレスは到達不能です)。オフアドレス/ポインタC

ここで、NULLと同じ正確な特性を持つが、NULL(NULL!NULL = NULL2)と区別できる別のNULL(NULL2と呼ぶことができます)が必要であるとしましょう。私はメモリ(それほどではありません)の理解から、NULLポインターは頻繁にオフリミットのメモリセグメント内のアドレスを指しています。つまり、私は、通常、単一のアドレスだけでなく、メモリのセグメント全体がオフリミットであることを意味します。だから私はNULL2をNULL + 1として定義したと言うことができます(私はおそらくあなたがひどくなるかもしれないか、おそらく少しのギャグを知っている)NULL2理論的に(私はそれを定義したように)も到達できない(同じ意味でNULLが到達できない)

答えは完全にプラットフォーム固有のものになると思いますので、例は私が探しているものです。しかしより一般的には、NULLと同じ方法で無効(または到達不能など)であることがISO-C標準によって定義されている他のポインタアドレスがあります。無効(または無効)のすべての住所の一般的な説明と、無効な理由については、参考になります。そして、あなたが私に "なぜ神の愛のためにこれをする必要があるのか​​"と尋ねる必要があると感じるなら、私の答えは本当に何もする必要はないということです。その仮説的な質問です。

+0

テキストを段落に挿入します。 –

+0

[ask]をお読みください。 – OldProgrammer

+0

これは、この特定の動作であなた自身の言語を作成する必要がある場合は、仮想的に、あなたがこれを必要とする場合。 Cではできません。異なるものを表現しない場合は、2つの異なる種類の無効なポインタを定義することができません –

答えて

0

いいえ、NULLはゼロを表します。 はい、NULL + 1動作を使用するとプラットフォーム固有の動作になります。しかし、私は0x0001のアドレスがプログラマーにとってしばしば利用可能であるとは思わないので、利用できない良いアドレスと見なすことができます。私はこのような何かをするだろうあなたの代わりに

:(重点:

#define NULL2 null2() 
void *null2() 
{ 
    static char pointing_me_is_invalid; 
    return &pointing_me_is_invalid; 
} 
0

私はちょうどNULL + 1は6.5.6添加剤事業者に言う

N1570 C.で未定義の動作を呼び出すやって怖いです鉱山)添加のため

2、両方のオペランドが算術型を有するもの、または 一方のオペランドがACにポインタでなければならないのいずれかでオププテートオブジェクトタイプおよび は、整数型を持ちます。

(インクリメントが 1を追加することと同じである)私はNULLが、完全なオブジェクト型を指すように保証されているとは思いません。たとえば、((void *)0)はありません。

「まったく仮説的な質問」でも、まだ到達できない別のアドレス定数が必要な理由はまだ分かりません。そのような定数が実際に存在する場合、それは移植可能ではありません。したがって、単に0またはNULLを使用すると、コンパイラが残りの部分を処理します。