#include <stdio.h>
main() {
int *i,*j;
i = (int *) 60;
j = (int *) 20;
printf("%d\n", i - j);
}
このコードの出力はどうなりますか? 私はポインタを使って多くの作業をしてきましたが、そのようなコードに出くわしたことはありません.
同じ配列オブジェクト内を指していないポインターを減算しているため、これは未定義の動作です。
2 つのポインターが減算されると、両方が同じ配列 object の要素を指すか、配列オブジェクトの最後の要素の 1 つ後ろを指します。結果は、2 つの配列要素の添字の差です。
また、無効なオブジェクトへのポインターを使用するなど、他の理由で未定義の動作である可能性もあります。
私は 10 の出力を取得しています..しかし、方法を理解できませんでしたか?
未定義の動作は別sizeof(int)
として、お使いのマシンで is が 4 の場合、実際にはアドレス20
との間に 10 個の整数があります60
。それがポインタ減算で得られるものです:要素数の差です。
前述teppic
のように、あなたの printf は間違っています。2 つのポインターの違いはptrdiff_t
. 形式は次のようになり%td
ます。
nullポインターでも、有効なオブジェクトを指すポインターでもないポインターは、無効なポインターです。値の読み取りなど、無効なポインターの使用は未定義の動作です。