2

より複雑な問題でこのコードを使用したいのですが、機能しませんでした。マトリックスが印刷されないのはなぜですか?

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

void print_mat(int **a, int n)
{
    printf("\n");
    int k,t;
    for (k=1;k<=n;k++)
    {
        for (t=1;t<=n;t++)
            printf("%d ", a[k][t]);
        printf("\n");
    }
}

int main()
{
    int i,j,n,**a;
    printf("Chess board size=");
    scanf("%d", &n);
    a=(int **)malloc(n*sizeof(int));
    for (i=1;i<=n;i++)
        a[i]=(int*)malloc(n*sizeof(int));
    for (i=1;i<=n;i++)
        for (j=1;j<=n;j++)
            a[i][j]=-1;
    print_mat(a,n);
    return 0;
}
4

4 に答える 4

9

最初にmallocを使用しint *ないintで、変更する必要があります

a = ( int ** )malloc( n * sizeof( int ) );

a = malloc( n * sizeof( int* ) ); //also no need to cast.

また、@ Russell Borogoveが提案したようfor( i = 0; i < n; i++ )に、fromの代わりにloopを変更します1 to n

于 2012-12-01T16:02:17.643 に答える
4

C配列でゼロベースのインデックスを使用する習慣を身に付け、ユーザーに物事を提示する場合にのみ、それらを1ベースであるかのように表示する必要があります。

for (i=1;i<=n;i++)ループをに変更しますfor (i=0;i<n;i++)。同様にj、、、kおよびt

現在書かれているように、a[n]は割り当てられたポインタではなく、バッファ割り当てa[0][n]の範囲内ではありません。a[0]その結果(OSX10.7.5ではgcc4.2.1)がプログラムのクラッシュになります。

于 2012-12-01T16:02:40.173 に答える
0

a=(int **)malloc(n*sizeof(int));

への変更a= mallo(n*sizeof(int*))

一部のシステムintint*(ポインタ)は同じサイズである可能性がありますが、これが問題を引き起こしている可能性があります。

また

for (i=1;i<=n;i++)
    for (j=1;j<=n;j++)
     a[i][j]=-1;

に変更します

for (i=0;i<n;i++)
    for (j=0;j<n;j++)
    a[i][j]=-1;
于 2012-12-01T16:02:27.503 に答える
0

この線

a=(int **)malloc(n*sizeof(int));

読む必要があります

a=malloc(n*sizeof(int *));
于 2012-12-01T16:03:41.420 に答える