1

静的ストレージ期間と等しい定数初期化子を持つ 2 つのオブジェクトを考えてみましょう。

static const int a = 50;
static const int b = 50;

コンパイラがこれらを次のように組み合わせることは有効です&a == &bか?

(文脈上、静的定数オブジェクトを使用して一意のアドレスを取得し、センチネル ポインター値として使用することを考えていました。コンパイラがそのようなオブジェクトを結合することが合法であり、2 つのそのようなオブジェクトに同じ定数値を使用する場合、アドレスは可能性があります。等しくなければ、それらをセンチネル値として使用することはできません。)

4

2 に答える 2

2

ポインターは等しくない比較をする必要があります。C99 6.5.9 パラグラフ 6 を参照してください。

2 つのポインターが等しく比較されるのは、両方がヌル ポインターであり、両方が同じオブジェクト (オブジェクトおよびその先頭のサブオブジェクトへのポインターを含む) または関数へのポインターであり、両方が同じ配列の最後の要素の 1 つ後ろを指すポインターである場合のみです。オブジェクト、または 1 つは 1 つの配列オブジェクトの末尾を過ぎたものへのポインターであり、もう 1 つは別の配列オブジェクトの先頭へのポインターであり、アドレス空間内の最初の配列オブジェクトの直後にたまたま続きます。

于 2013-05-23T17:53:08.890 に答える
1

いいえ、規格はそれを禁じています。個別のオブジェクトには個別のアドレスが必要です。ではconst char a[]="abc", b[]="abc";abは異なるアドレスに配置されています。これは、それらがポインターである場合にも当てはまります。const char *a="abc", *b="abc",b`andでは、異なるアドレスにも割り当てられます。それらが指す文字列定数は、名前付きオブジェクトであるかのように、単一の定数配列にすることができます。

于 2013-02-08T05:26:48.030 に答える