1

だから私はCでプログラムを実行していますが、出力がどのように生成されるかわかりません??

プログラムは次のとおりです。

#include <stdio.h>
int c;
void main() {
    int a=10,b=20,j;
    c=30;
    int *p[3];
    p[0]=&a;
    p[1]=&b;
    p[2]=&c;
    j=p[0]-p[2];
    printf("\nValue of p[0] = %u\nValue of p[2] = %u\nValue of j = %d\n\n",p[0],p[2],j);
}

出力は次のとおりです。

Value of p[0] = 3213675396
Value of p[2] = 134520860
Value of j = -303953190

jがこの値、つまり-303953190を取得した方法を誰か教えてもらえますか?? 3079154536 のはずです

4

5 に答える 5

1

2 つのポインターを減算すると、符号付き整数になります。

C標準の章 6.56 から:

6.5.6 加法演算子

[...]

9 2 つのポインタが減算される場合、両方が同じ配列オブジェクトの要素、または配列オブジェクトの最後の要素の 1 つ後ろを指す必要があります。結果は、2 つの配列要素の添字の差です。結果のサイズは実装定義であり、その型 (符号付き整数型) は< stddef.h >ヘッダーで定義されているptrdiff_t です。

そして、ポインタの差を に代入すると、intがオーバーフローしintます。

代わりにこのオーバーフローを回避するには

int j;

使用する

ptrdiff_t j;

を使用して値を出力し%tdます。

C標準の章から7.17 :

7.17 共通定義< stddef.h>

[...]

2 型は、2 つのポインターを減算した結果の符号付き整数型である
ptrdiff_tです。


また(無関係)

void main()

間違っている。それは

int main(void)

したがって、正しいコードは次のようになります。

#include <stdio.h>
#include <stddef.h> /* for ptrdiff_t */

int c;

int main(void) 
{
  int a=10, b=20;
  ptrdiff_t j;
  int * p[3];

  c=30;

  p[0]=&a;
  p[1]=&b;
  p[2]=&c;

  j=p[0]-p[2];

  printf("\nValue of p[0] = %p\nValue of p[2] = %p\nValue of j = %td\n\n",
    (void *) p[0],
    (void *) p[2],
    j);

  return 0;
}
于 2013-11-11T13:04:27.450 に答える
1

3213675396 - 134520860 を実行しています。値を取得する場合は、*p[0] を使用します。あなたの意図がアドレスを減算することである場合 (意味はありませんが、それでも) 予想される答えは 3079154536 になるはずです。数直線で簡単にするために char を検討してください

-128 -127 -126 -125 ... 0 1 2 ... 125 126 127

ここで、128 を範囲外に格納しようとすると、値が -128 になります。値 130 を割り当てようとすると、-126 になります。したがって、右側の制限を超えると、左側からカウントが開始されることがわかります。これは単なる説明目的のためであり、この動作の本当の理由は、2 の賛辞として保存されるという事実によるものです。詳細はこちら

于 2013-11-11T13:06:14.427 に答える
0

符号なしではなく整数として出力しています。%uの代わりに使用し%dます。

これを試して:

#include <stdio.h>
int c;
void main() {
    int a=10,b=20;
    unsigned j;
    c=30;
    int *p[3];
    p[0]=&a;
    p[1]=&b;
    p[2]=&c;
    j=(unsigned)p[0]-(unsigned)p[2];
    printf("\nValue of p[0] = %u\nValue of p[2] = %u\nValue of j = %u\n\n",(unsigned)p[0],(unsigned)p[2],j);
}
于 2013-11-11T13:50:43.093 に答える