【问题标题】:can I use **i instead of *i[20] for initializing 2d array?我可以使用 **i 而不是 *i[20] 来初始化二维数组吗?
【发布时间】:2017-06-26 14:08:23
【问题描述】:

我想使用指向指针的指针初始化一个二维数组,我编写了以下代码。
下面的代码是很多硬编码,但由于我是指针的初学者,所以我想这样做。
该代码未将输出视为分段错误。
不过在我看来一切都很好。

    #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

【问题讨论】:

  • 指针不是二维数组:stackoverflow.com/questions/4470950/…
  • a=(int**)malloc(row*column*sizeof(int)); 错误,您需要为 n(行数)"pointers" 预留空间到int,而不是:a = malloc(row * sizeof(int *)); 或更好@ 987654326@,bc也一样,然后需要循环使用a[i] = malloc(column * sizeof **a);为表格的每一行预留空间。
  • 你所做的只是创建一个大小为 row*col 的一维数组,而不是一个二维数组。

标签: c pointers multidimensional-array segmentation-fault


【解决方案1】:

您可以使用以下代码为二维数组分配内存:

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);
}

【讨论】:

  • +1 用于转换 malloc() 的结果,这是在这里仔细检查赋值正确性的一个很好的例子。
  • 这不会创建一个真正的二维数组;它创建一个指针数组,每个指针指向一个单独的int 数组。这些行在内存中不会是连续的; arr[0][n-1]arr[1][0] 之间会有一个差距。这不一定是个问题,但人们需要意识到差异。
  • @ctx: 强烈不同意 - 从 C89 开始,强制转换 malloc 的结果是不必要的,它增加了您的维护负担,它使代码更难阅读,并且在 C89 下如果您忘记包含stdlib.h 或在范围内没有malloc 的声明,它将抑制诊断。无论a 的类型如何,T *a = malloc( sizeof *a * number_of_elements); 都会始终做正确的事。如果您使用的是 C89 之前的实现或编译为 C++(在这种情况下,您应该改用 new 运算符),您应该只转换 malloc 的结果。
  • @JohnBode 我知道这些论点,它们都是我眼中的情绪。它根本不会增加维护负担,它在许多情况下使代码更具可读性,并且使编译器能够及早显示错误(在这种情况下,例如a 的取消引用级别错误)。 stdlib.h 参数也是一个笑话,因为如果忘记了可能会有许多其他警告。
  • @ctx:回复:stdlib.h - 不是开玩笑。我不止一次被它咬过。从 C99 开始,这不再是问题(不再允许隐式输入),但是,如果您在范围内没有声明,则投射 malloc 真的 的结果会抑制诊断,你最终会从void *int 转换为其他指针类型,这有时会导致微妙的运行时错误,调试时间过长。
猜你喜欢
  • 2016-12-20
  • 2015-03-16
  • 2021-09-28
  • 2012-09-16
  • 2018-03-04
  • 2012-11-29
相关资源
最近更新 更多