C 我可以使用**I而不是*I[20]来初始化2d数组吗?

C 我可以使用**I而不是*I[20]来初始化2d数组吗?,c,pointers,multidimensional-array,segmentation-fault,C,Pointers,Multidimensional Array,Segmentation Fault,我想使用指向指针的指针初始化2d数组,并编写了以下代码。 下面的代码是大量的硬编码,但由于我是指针的初学者,我希望这样做。 代码未以分段错误的形式给出输出。 不过我觉得一切都很好 #include<stdio.h> #include<stdlib.h> int readinput1(int **a,int row,int column); int readinput2(int **b,int row,int column);

我想使用指向指针的指针初始化2d数组,并编写了以下代码。
下面的代码是大量的硬编码,但由于我是指针的初学者,我希望这样做。
代码未以分段错误的形式给出输出。
不过我觉得一切都很好

    #include<stdio.h>  
    #include<stdlib.h>  
    int readinput1(int **a,int row,int column);
    int readinput2(int **b,int row,int column);
    int sumoftables(int **a,int **b,int **c,int row,int column);
    int displayresult(int **c,int row,int column);

int main()
    {
        int **a,**b,**c,row,column;
        printf("no.of rows of desired matrix:");
        scanf("%d",&row);
        printf("no.of columns of desired matrix:");
        scanf("%d",&column);
        a=(int**)malloc(row*column*sizeof(int));>can i do the memory allocation like this
        readinput1(a,row,column);
        b=(int**)malloc(row*column*sizeof(int));
        readinput2(b,row,column);
        c=(int**)malloc(row*column*sizeof(int));
        sumoftables(a,b,c,row,column);
        printf("\n\n\n");
        displayresult(c,row,column);

    }
    int readinput1(int **a,int row,int column)
    {
        int p,q;
        for(p=0;p<row;p++)
        {
            for(q=0;q<column;q++)
            {
                scanf("\n%x",(*(a+p)+q));
            }
        }
        return 0;
    }


    int readinput2t2(int **b,int row,int column)
    {
        int p,q;
        for(p=0;p<row;p++)
        {
            for(q=0;q<column;q++)
            {
                scanf("\n%x",(*(b+p)+q));
            }
        }
        return 0;
    }
    int sumoftables(int **a,int **b,int **c,int row,int column)
    {
        int p,q;
        for(p=0;p<row;p++)
        {
            for(q=0;q<column;q++)
            {
                *(*(c+p)+q)=*(*(a+p)+q)+*(*(b+p)+q);
            }
        }
                  return 0;
    }
    int displayresult(int **c,int row,int column)
    {
        int r,s;
        for(r=0;r<row;r++)
        {
            for(s=0;s<column;s++)
            {
                printf("\t%d",*(*(c+r)+s));
            }
            printf("\n");
        }
        return 0;
    }


  [1]: https://i.stack.imgur.com/aj1AI.png
#包括
#包括
int readinput1(int**a,int行,int列);
int readinput2(int**b,int行,int列);
int汇总表(int**a、int**b、int**c、int行、int列);
int显示结果(int**c,int行,int列);
int main()
{
int**a、**b、**c、行、列;
printf(“所需矩阵的行数:”);
scanf(“%d”行和第行);
printf(“所需矩阵的列数:”);
scanf(“%d”列和列);
a=(int**)malloc(row*column*sizeof(int));>我可以这样分配内存吗
readinput1(a、行、列);
b=(int**)malloc(行*列*大小(int));
readinput2(b,行,列);
c=(int**)malloc(行*列*大小(int));
汇总表(a、b、c、行、列);
printf(“\n\n\n”);
显示结果(c、行、列);
}
int readinput1(int**a,int行,int列)
{
int p,q;

对于(p=0;p您可以使用以下代码为2D数组分配内存:

void array_2d_allocate(int ***a, int row, int column)
{
    *a =(int**)malloc(row*sizeof(int*));
    for(int i=0; i < row; i++){
        (*a)[i] = (int*)malloc(column*sizeof(int));
    }
}

int main()
{
    int **a,**b,**c,row,column;
    printf("no.of rows of desired matrix:");
    scanf("%d",&row);
    printf("no.of columns of desired matrix:");
    scanf("%d",&column);
    array_2d_allocate(&a, row, column);
    readinput1(a,row,column);
    array_2d_allocate(&b, row, column);
    readinput2(b,row,column);
    array_2d_allocate(&c, row, column);
    sumoftables(a,b,c,row,column);
    printf("\n\n\n");
    displayresult(c,row,column);
}
void数组\u 2d\u分配(int***a,int行,int列)
{
*a=(int**)malloc(row*sizeof(int*);
对于(int i=0;i
指向指针的指针不是2d数组:
a=(int**)malloc(row*column*sizeof(int));
是错误的,您需要为指向
int
的n(行数)“指针”预留空间:
a=malloc(row*sizeof(int*);
或者更好的是
a=malloc(row*sizeof*a);
,与
b
c
相同,然后您需要在循环中使用
a[i]=malloc(column*sizeof**a);
为表的每一行保留空间。您所做的只是创建大小为row*col的一维数组,而不是二维数组。+1用于转换malloc()的结果,这是双重检查赋值正确性的一个很好的例子。这不会创建真正的2D数组;它会创建一个指针数组,每个指针指向一个单独的
int
数组。这些行在内存中不是连续的;在
arr[0][n-1]
arr[1][0]之间会有一个间隙
。这不一定是个问题,但人们需要意识到其中的区别。@ctx:强烈反对-从C89开始,不需要对
malloc
进行结果转换,这会增加您的维护负担,使代码更难阅读,并且在C89下,如果您忘记包含
stdlib.h
或ot,则会抑制诊断HeWISW在范围内没有声明<代码> MalOC 。<代码> t*a= Malc(sisioof *a*NUMBROYOFFEX元素);< /C> >总是遵循正确的规则,不管<代码> A<代码> >类型。如果使用C89C+实现或编译为C++,则只应使用<代码> MalOC 的结果。(在这种情况下,你应该改用
新的
操作符)。@JohnBode我知道参数,它们在我眼中都是情绪。它根本不会增加维护负担,在许多情况下,它使代码更易于阅读,并使编译器能够尽早显示错误(在本例中,例如,如果
a
的取消引用级别是错误的)。stdlib.h参数也是一个笑话,因为如果忘记,可能会有许多其他警告。@ctx:Re:
stdlib.h
-不是笑话。我不止一次被它咬了一口。从C99开始,它不再是一个问题(不再允许隐式键入),但是是的,如果在作用域中没有声明,则强制转换
malloc
的结果确实会抑制诊断,并且最终会从
void*
转换为
int
,再转换为其他指针类型,这偶尔会导致微妙的运行时错误,导致调试时间过长。