私はポインタ算術で遊んでいて、ポインタの減算と比較に関するC標準の2つのルールに遭遇しました。ポインタの減算と比較ルールの混乱
ルール1:2つのポインタを減算する場合、どちらも同じ配列オブジェクトの要素を指すか、配列オブジェクトの最後の要素を1つだけ指す必要があります(C標準、6.5.6)。結果は2つの配列要素の下付き文字の違いになります。それ以外の場合、操作は未定義の動作です(48)。
ルール2:同様に、関係演算子<を使用するポインタを比較すると、< =、> =、および>は、相互の相対的なポインタの位置を示します。同じ集合体または共用体を指していない(同じ配列オブジェクトを超えている)ポインタは、関係演算子(6.5.8)を使用して比較されます。それ以外の場合、操作は未定義の動作です(53)。
同じ配列を参照しないポインタを減算または比較することは、未定義の動作です。
質問1:上記のルール1のとおり、動作は未定義ですが、プログラムはアドレスを出力として出力します。アドレスを含む変数を逆参照しようとすると、プログラムがクラッシュします。存在する住所はどうしてありますか?住所が指す値は存在しません。
質問2:2つの異なる配列を参照する2つのポインタを比較演算子を使って比較すると、定義されていない動作ですが、プログラムはクラッシュしますが、結果は出力に終わりますか?そんなことがあるものか?
誰かがこのルールの混乱に関してお手伝いできますか?私は以下のコードを掲載している2つのポインタを減算
#include <stdio.h>
int main()
{
char *pointer_1;
char *pointer_2;
char *difference;
int counter=0;
char string[20]={"Pointer Arithmetic"};
char str[30]={"Substraction and Comparison"};
pointer_1=string;
pointer_2=str;
difference=(char *)(pointer_2-pointer_1);
printf("%p\n",difference); Address exists
/*printf("%c\n",difference);*/ Dereferencing leads to program crash
while(pointer_1>pointer_2) Is one is allowed to use relational operators on
pointers which point to two different arrays?
{
{
counter++;
pointer_2++;
}
}
printf("%d",counter);
}
未定義の動作!=クラッシュする必要があります。それは「正しく」働くことを含む何でもすることができます。 – HolyBlackCat
ポインタの結果を 'int'に引く。だから 'difference =(char *)(pointer_2-pointer_1);'は意味をなさない。 –
2つのアドレスの違いは、それ自体がアドレスではありません。明確に述べられているように、それは「下付き文字の違い」です。 %pを使用しても1つにならないので、printfはプログラムをクラッシュさせる義務がありません。 –