1

誰かがこれを説明できますか?

#include<stdio.h>

void FunPrinter(int *x)
{
 int i, j;
 for(i = 0; i < 4; i++, printf("\n"))
  for(j = 0; j < 5; j++)
   printf("%d\t",*x++);
}

int main()
{
 int x[][5] = {
        {17, 5, 87, 16, 99},
        {65, 74, 58, 36, 6},
        {30, 41, 50, 3, 54},
        {40, 63, 65, 43, 4}
       };
 int i, j;
 int **xptr = x;
 printf("Addr:%ld,Val:%ld,ValR:%ld",(long int)x,(long int)*x,(long int)**x);
 printf("\nInto Function\n");
 FunPrinter(&x[0][0]);
 printf("\nOut Function\n");
 for(i = 0; i < 4; i++, printf("\n"))
  for(j = 0; j < 5; j++)
   printf("%d\t",**xptr++);
 return 0;
}

出力:

Addr:140734386077088,Val:140734386077088,ValR:17
Into Function
17  5   87  16  99  
65  74  58  36  6   
30  41  50  3   54  
40  63  65  43  4   

Out Function
Segmentation fault (core dumped)

ダイレクトアドレッシングが機能しないのはなぜですか?ポインタを介してアクセスしています。ダブルポインタを使用しましたが、機能しません。また、xptrとして単一のポインターを使用しようとしました。しかし、まだ機能していません。

4

1 に答える 1

1

間違ったポインター(最も外側のディメンションポインター)を反復処理しているため、セグメンテーション違反が発生しています。そのディメンションには、反復できる有効なブロックが4つしかありません(20ではありません)。

ここで、x*x%pキャストではなくポインタを出力するために使用)は同じ値です。どちらも配列の先頭(同じアドレス)を指しているためですが、ポインタの演算は異なります(要素のサイズが異なります)。xにキャストする必要があるかもしれないので、繰り返すことができますint *

また、2D配列を1D配列に分解する際に使用しているアプローチが機能することFunPrinterは保証されていませんが、実際には未定義の動作が含まれます(ただし、ほとんどの妥当なコンパイラーはこれを問題なくコンパイルします)。

于 2012-09-25T07:37:36.247 に答える