0

2 Dims配列としてintgerへのポインターへのポインターを使用しています。これらのコードを記述しましたが、整数値を取得できませんでした。

#include<stdio.h>
#include<conio.h>

void main(void)
{
    int **pptr = 0, size = 0, size2 = 0, i, j;

    clrscr();
    printf("Enter Size of Main Store n");
    scanf("%d", &size);

    pptr = (int **) malloc(size * sizeof(int *));

    printf("Enter Size of Sub Store n");
    scanf("%d", &size2);

    for (i = 0; i < size; i++) {
        pptr[i] = (int *) malloc(size2 * sizeof(int));
    }

    printf("Enter Values n");

    for (i = 0; i < size; i++) {
        for (j = 0; j < size2; j++) {
            scanf("%dn", pptr[i][j]);
        }
    }

    clrscr();
    printf(" Valuesn");

    for (i = 0; i < size2; i++, pptr++) {
        printf("%dn", *pptr + i);
    }

    getch();
}

ゴミを印刷します!!

4

2 に答える 2

2

scanf("%d", arg)へのポインタを期待しますがint

for (i = 0; i < size; i++) {
    for (j = 0; j < size2; j++) {
        scanf("%dn", pptr[i][j]);
    }
}

intあなたはそれに、初期化されていないものを渡しますint。そのメモリ位置の不確定な値はポインタとして解釈され、スキャンは変換された値who-knows-whereを格納しようとします。それがセグメンテーション違反を引き起こす可能性は低いです。

&pptr[i][j]そこで引数として渡す必要があります。

for (i = 0; i < size2; i++, pptr++) {
    printf("%dn", *pptr + i);
}

引数を期待する形式を使用してint* *pptr +i、を出力します。&pptr[0][i]%dint

あなたがすべき

printf("%d\n", pptr[0][i]);

対角線の値を出力する場合(ループ内でもインクリメントするため、そうであるように思われpptrます)、またはより適切な場合

for(i = 0; i < size && i < size2; ++i) {
    printf("%d\n", pptr[i][i]);
}

または、グリッド全体を印刷する場合は、

for(i = 0; i < size; ++i) {
    for(j = 0; j < size2; ++j) {
        printf("%d ", pptr[i][j]);
    }
    printf("\n");
}
于 2012-11-27T03:57:43.363 に答える
0

scanf はint *ではなくを受け取りますint。そう...

scanf("%dn", pptr[i][j]);

次のようにする必要があります。

scanf("%dn", &(pptr[i][j]));

または次のようになります。

scanf("%dn", (pptr[i]+j));

また、printf にはintポインターではなく値 ( ) が必要です。そう...

printf("%dn", *pptr + i);

おそらく次のようになります。

printf("%dn", *(*pptr+i));

または、はるかに見栄えの良い同等のもの:

printf("%dn", pptr[0][i]);
于 2012-11-27T04:03:24.377 に答える