0

まず、コードに論理エラーがあります。さて、これがコードです

#include <stdio.h>

int main()
{
    long i,j,t;
    scanf("%ld",&t);
    long n[t],d[t][t];
    for(i = 0; i < t;i++){
        scanf("%ld",&n[i]);
        for(j = 0; j < n[i] ;j++){
            scanf("%ld",&d[j][i]);
        }
    }
    for(i = 0; i < t;i++){
        for(j = 0; j < n[i] ;j++){
            printf("%ld ",d[j][i]);
        }
        printf("\n");
    }
    return 0;
}

そして、私はデータを入力します

2
4
25 20 30 90
3
45 50 55

そして結果は

25 20 30 90
45 50 55

まあ、それは私が期待したものです。しかし、入力がこのようになると

3
5
12 67 89 34 56
6
34 56 78 90 12 34
7
12 34 89 23 56 78 89

結果はこうなりました

12 34 89 23 56 78 89
12 67 89 34 56 4206692 7 2293472 1982002386 16 3 2293344 2293408 0 2293552 0 0 4
198585 8918456 1982106837 1982010910 8918456 2293640 0 0 1985286516 2009576437 0
 0 2293664 2009323341 2293740 2147348480 0
34 56 78 90 12 34 4199405 1982595752 8 12 2293424 2 2 1982356412 2147348480 2293
608 2147348480 1 -1 297753669 1982010784 1982015505 4199044 0 0 2147348480 21473
48480 0 0 0 7273647 2009576392 0 0 0 1 0 20 52 0 0 438759246 736 -214797894 1420
 760826203 2272 852421325 3108 944791496 4028 -1322777276 4988 9 1 1 1204 7168 4
 2 152 11832 7 1 40 12316 1682469715 1 140 44 0 0 0 2 0 7209065 5701724 6029427

12 34 89 23 56 78 89

さて、簡単な質問ですが、出力が上記のようになるのはなぜですか?? 上記の 2 を入力すると、同じ結果が発生します。差し支えなければ、考えられる回答とリンクはありますか?? ありがとう

4

3 に答える 3

1

多くの場合、2D 配列の外に書き込んでおり、エラーが発生しないこともありますが、それは偶然です。

入力する配列の数によって 2D 配列のサイズを決定しますが、同時に内部配列のサイズも決定します。

scanf("%ld",&t);
long n[t],d[t][t];

たとえば、最初の例を見てみましょう。

2              >> create array n[2], and array d[2][2]
4              >> number of values to d[0]
25 20 30 90    >> d[0][1] = 25 d[0][2] = 20 you access d[0][3] and d[0][4] but you are not allowed to do that.
3              >> number of values to d[1]
45 50 55       >> d[1][0] = 45 d[1][1] = 50 you access d[1][2] but you are not allowed to do that
于 2012-05-04T04:37:18.153 に答える
0

使えると思いますmalloc

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

int main()
{
    long i,j,t;
    printf("Rows : ");
    scanf("%ld",&t);
    long *n;
    long **d;
    n = (long* )malloc(sizeof(long) * t); // add malloc
    d = (long** )malloc(sizeof(long *) * t); // add malloc

    for(i = 0; i < t;i++){
        printf("Column : ");
        scanf("%ld",&n[i]);
        d[i] = (long* )malloc(sizeof(long) * n[i]); //add malloc
        if(d[i] == NULL)
        printf("ERROR\n");

        for(j = 0; j < n[i] ;j++){
            scanf("%ld", &d[i][j]); // change from &d[j][i]
        }
    }
    printf("\n\n");
    for(i = 0; i < t;i++){
        for(j = 0; j < n[i] ;j++){
            printf("%ld ",d[i][j]); // change from d[j][i]
        }
        printf("\n");
    }
    return 0;
}

さて、簡単な質問ですが、出力が上記のようになるのはなぜですか?? 上記の 2 を入力すると、同じ結果が発生します。差し支えなければ、考えられる回答とリンクはありますか?? ありがとう

  1. 使用されているよりも少ないメモリを割り当てるためです。
  2. scanf("%ld", &d[j][i]);「i」と「j」を交換する必要があります。
于 2012-05-04T09:16:23.013 に答える
0

sizet*tで行列を作成してから、行に多かれ少なかれ要素を入力します。

あまりにも少ない要素で行を埋めると、残りは初期化されないままになり、奇妙な数値が得られます。これらの要素を印刷しないので、あなたの場合は問題ありません。

行にあまりにも多くの要素を入力すると、余分な要素が次の行に重なります。また、マトリックス全体を超えて、スタックが破損する可能性があります。
これが起こっていることだと思います-n配列がオーバーランし、コードが狂います。

于 2012-05-04T04:38:15.847 に答える