2

最後の2つの数字と他の2つの奇妙な数字を画面に表示します。すべての要素を印刷するにはどうすればよいですか?ダブルポインタの先頭を**別のポインタ**でばかにしようとしました。しかし、それは機能しないようです。

#include<stdio.h>
#include<stdlib.h>

typedef struct a {
    int x;

}A_t;

typedef struct b {

    A_t **y;

}B_t;

int main() {


    int i, j;

    A_t **fool, **st;

    fool = (A_t**)malloc(2 * sizeof(A_t*));
    st = fool;

    for(i = 0; i < 2; i++) {

        fool[i] = (A_t*)malloc(2 * sizeof(A_t));

        for(j = 0; j < 2; j++) {
            printf("NR: ");
            scanf("%d", &(*fool)[j].x);
        }

    }

    fool = st;
    for(i = 0; i < 2; i++) {
        for(j = 0; j < 2; j++) {
            printf("%d ", (*fool + i)[j].x);
        }
    }

    return 0;
}
4

2 に答える 2

0

これは、の2番目の「行」を読み取っていないためですfool。としてモデル化できるscanf("%d", &(*fool)[j].x);逆参照は、j番目の要素にアクセスします(したがって、最初のインデックスは変更しないため、最後に読み取られた2つの値が占有します。その後、他の2つの値は単純にランダムに取得されます。初期化されていない変数の読み取りは未定義の操作であるためです。実際には、アプリケーションの前に、メモリのその領域に存在していたものをすべて取得する傾向があります。foolfool[0]fool[0][j]fool[0][0]fool[0][1]

printf代わりに、 (例)で使用した構文を使用するかscanf("%d", &(*fool+i)[j].x)、これを入力しているときにKerrekSBが上記に投稿したように、代わりに標準の配列アクセス操作を使用できます。

これについて詳しく説明すると、はとfool[i][j]同等(*fool+i)[j]です。

于 2013-02-16T00:58:46.803 に答える
0

とにある必要が&fool[i][j].xありscanfます。fool[i][j].xprintf

于 2013-02-16T00:57:17.763 に答える