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 *not 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 1 to n

于 2012-12-01T16:02:17.643 回答
4

您将希望养成对 C 数组使用从零开始的索引的习惯,并且仅在向用户呈现内容时将它们显示为好像它们是从 1 开始的一样。

for (i=1;i<=n;i++)将循环更改为for (i=0;i<n;i++). 与jk和 也是如此t

如当前所写,a[n]不是分配的指针,a[0][n]也不在a[0]缓冲区分配内。结果(OSX 10.7.5 上的 gcc 4.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 回答