我想在更复杂的问题中使用此代码,但我没有让它工作。为什么我的矩阵不打印?
#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;
}
答案 0 :(得分:9)
首先应该将int *
而不是int
的尺寸设为malloc,然后更改
a = ( int ** )malloc( n * sizeof( int ) );
到
a = malloc( n * sizeof( int* ) ); //also no need to cast.
另外,正如@Russell Borogove建议的那样,将循环更改为for( i = 0; i < n; i++ )
而不是1 to n
。
答案 1 :(得分: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]
缓冲区分配范围内。结果(OSX 10.7.5上的gcc 4.2.1)是一个程序崩溃。
答案 2 :(得分:0)
a=(int **)malloc(n*sizeof(int));
更改为a= mallo(n*sizeof(int*))
在某些系统上int
和int*
(指针)可以具有相同的大小,但这可能会造成问题。
另外
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;
答案 3 :(得分:0)
该行
a=(int **)malloc(n*sizeof(int));
应该阅读
a=malloc(n*sizeof(int *));