0
#include <stdio.h>

main() {
  int *i,*j;
  i = (int *) 60;
  j = (int *) 20;
  printf("%d\n", i - j);
}

このコードの出力はどうなりますか? 私はポインタを使って多くの作業をしてきましたが、そのようなコードに出くわしたことはありません.

4

2 に答える 2

4

同じ配列オブジェクト内を指していないポインターを減算しているため、これは未定義の動作です。

2 つのポインターが減算されると、両方が同じ配列 object の要素を指すか、配列オブジェクトの最後の要素の 1 つ後ろを指します。結果は、2 つの配列要素の添字の差です。

また、無効なオブジェクトへのポインターを使用するなど、他の理由で未定義の動作である可能性もあります。

私は 10 の出力を取得しています..しかし、方法を理解できませんでしたか?

未定義の動作は別sizeof(int)として、お使いのマシンで is が 4 の場合、実際にはアドレス20との間に 10 個の整数があります60。それがポインタ減算で得られるものです:要素数の差です。


前述teppicのように、あなたの printf は間違っています。2 つのポインターの違いはptrdiff_t. 形式は次のようになり%tdます。

于 2012-09-01T13:25:09.463 に答える
1

nullポインターでも、有効なオブジェクトを指すポインターでもないポインターは、無効なポインターです。値の読み取りなど、無効なポインターの使用は未定義の動作です。

于 2012-09-01T13:28:43.990 に答える