Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C中的指针。为什么不是';我的二维阵列没有打印出来吗?_C_Pointers - Fatal编程技术网

C中的指针。为什么不是';我的二维阵列没有打印出来吗?

C中的指针。为什么不是';我的二维阵列没有打印出来吗?,c,pointers,C,Pointers,我想在一个更复杂的问题中使用这段代码,但我没有让它工作。为什么我的矩阵没有打印出来 #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]

我想在一个更复杂的问题中使用这段代码,但我没有让它工作。为什么我的矩阵没有打印出来

#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;
}
#包括
#包括
无效打印材料(整数**a,整数n)
{
printf(“\n”);
int k,t;

对于(k=1;k您应该首先对
int*
的大小进行malloc,而不是
int
,更改

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

此外,正如@Russell Borogove所建议的,将循环更改为(i=0;i
,而不是从
1更改为n

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

更改为
a=mallo(n*sizeof(int*)

在某些系统上,
int
int*
(指针)的大小可能相同,但这可能是造成问题的原因


for(i=1;i您需要养成在C数组中使用基于零的索引的习惯,并且仅在向用户呈现内容时才将它们显示为基于1的索引

更改(i=1;i行的

a=(int **)malloc(n*sizeof(int));
应该读

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

我知道,但对于这个特殊的问题,从一开始比从零开始更有效。这不是“更有效”,只是更熟悉。在这种情况下,这也是错误的-a[n]不是分配的指针,[0][n]在a[0]的末尾缓冲区分配。养成在C中使用基于0的索引的习惯,并仅在面向用户的显示中显示为基于1的索引。这是认真的。而不是
a=malloc(n*sizeof(*a));
,但是+1表示“无需强制转换”。那么int(a)[n]=malloc nsizeof(int[n])呢?@RamyAlZuhouri,我不明白你指的是什么。要分配一个指向数组的指针,这样所有的内存都是相邻的,并且可以使用像memset这样的函数在这个内存上写一个唯一的块。@RamyAlZuhouri,在这种情况下你可以做
a=malloc(n*n*sizeof(int))
。你的实际输出是什么?如果,例如“分段错误”,这是你应该告诉我们的。
for (i=0;i<n;i++)
    for (j=0;j<n;j++)
    a[i][j]=-1;
a=(int **)malloc(n*sizeof(int));
a=malloc(n*sizeof(int *));