C语言 我不了解使用函数在二维数组中分配元素的内存

pb3s4cty  于 2022-12-03  发布在  其他
关注(0)|答案(1)|浏览(166)

首先我们在主程序中声明指向指针变量matrix=NULL的指针。2然后我们在函数中传递&matrix作为参数。3在函数中它有参数ex:void allocate(intpointer,int row,int column)现在,我开始对指针感到困惑。因为函数有3个星号(),所以在为二维数组分配内存时,我必须使用(pointer)还是只使用(pointer)。如下所示pointer= malloc(sizeof(int *)*row);指针=内存分配(大小(int *)*rwo):这之后我还有一个问题:
不知怎么的,我开始理解指针= malloc(sizeof(int *)row)是为数组的每一行分配内存,但是当它涉及到为每个元素分配内存时,我就更加困惑了。因为我们声明(matrix)/(函数中的指针)为指向指针的指针,但是当我们为每个元素分配内存时,我看到的是(pointer[i])/(poinetr +i)。

for(int i = 0 ;i<row ; i++)
        {
         *(pointer +i)=malloc(sizeof(int)*column);
        }

根据我的理解,当任何指针以1递增(++)时,它会增加大小,最终形成一个数组。

  • (指针+i)用于分配行.中元素的内存,而不是形成.数组。

我是在完全混乱与指针所以请考虑我的问题即使有意义谢谢这里是我的代码:
问题:获取输入矩阵的函数与动态内存分配相合并1计算matrix 1-matrix 2并将其存储到第三个矩阵并打印出结果矩阵的函数。1释放任意大小的矩阵的函数(您必须创建3函数,然后使用main中的函数调用创建程序,并在读取输入矩阵之前要求用户输入2输入矩阵的维数)

#include<stdio.h>
#include<stdlib.h>

void input( int ***pointer , int row , int column )
{
    pointer= malloc(sizeof(int*)*row);
    for(int i = 0 ;i<row ; i++)
    {
        *(pointer + i)=malloc(sizeof(int )*column);
    }

    for(int i = 0 ;i<row ;i++)
    {
        for(int j = 0;j <column; j++)
        {
            scanf("%d",&pointer[i][j]); 
        }
    }

}
void calculate(int ***pointer1 ,int ***pointer2 , int row , int column )
{
    int **matrix3= malloc(sizeof(int *)*row);

    for(int i =0 ;i<row ; i++)
    {
        *(matrix3 +i)=malloc(sizeof(int)*column);
    }

    for(int i= 0 ;i<row ;i++)
    {
        for(int j= 0;j <column; j++)
        {
            matrix3[i][j]=pointer1[i][j]-pointer2[i][j];
        }
    }

    for(int i = 0 ; i<row ;i++)
    {
        for(int j = 0 ;j<column; j++)
        {
            printf("%d ",matrix3[i][j]);
        }
        printf("\n");
    }

    for(int i = 0;i<row ;i++)
    {
        free(*(matrix3 +i));

    }
    free(matrix3);

}

void frem(int ***pointer1,int row )
{
    for(int i =0 ;i<row ;i++)
    {
        free(*(pointer1 +i));
    }
    free(pointer1);
}

int main ()
{
    int row , column ; 
    scanf("%d%d",&row , &column);

    int **matrix1= NULL ,**matrix2 =NULL ;
    input(&matrix1,row , column );
    input(&matrix2, row , column);
    calculate(&matrix1 , &matrix2 , row , column);
    frem(&matrix1, row );
    frem(&matrix2, row );
    return 0 ;
}

当我运行代码时它说

format ‘%d’ expects argument of type ‘int *’, but argument 2 has type ‘int **’ [-Wformat=]
   16 |             scanf("%d",&pointer[i][j]);
      |                    ~^  ~~~~~~~~~~~~~~
      |                     |  |
      |                     |  int **
      |                     int *
cbeh67ev

cbeh67ev1#

你使用int***的唯一原因是当你通过一个参数返回一个指针到指针的时候,你的函数input是完全错误的。

  • pointer= malloc(sizeof(int*)*row);是错误的,您应该指派一个指向pointer所指位置的指标:*pointer = malloc... .
  • *(pointer + i)首先,这种风格几乎总是错误的,因为它只是pointer[i]的一个可读性较低的版本。然而,这也是错误的,因为我们需要为每个先前分配的指向数组的指针赋值。这将是(*pointer)[i] = ...
  • 同样地,scanf("%d",&pointer[i][j]);应该是&((*pointer)[i][j])

如果我们先执行int** tmp,然后在变量上执行malloc,然后在函数*pointer = tmp;的最后,我们就可以避免所有这些混乱。
函数calculate同样没有任何意义,你根本不需要3级间接寻址,也不需要一个本地数组来保存结果。
更重要的是:***这种分配二维数组的方法从本质上开始是错误的!***它可能对字符串数组有意义,也就是所谓的“锯齿数组”。但是它对二维矩阵没有任何意义。下面详细解释为什么你的老师/书会教你错误的东西:Correctly allocating multi-dimensional arrays。请与未来的教师/作者分享...
简化的、对初学者友好的部分代码可能如下所示:

void* get_2D_matrix (int row, int col)
{
    // allocate an actual 2D array:
    int (*matrix)[col] = malloc( sizeof(int[row][col]) );
    if(matrix == NULL)
    {
      /* error handling */
    }

    for(int i=0; i<row; i++)
    {
        for(int j=0; j<col; j++)
        {
            scanf("%d",&matrix[i][j]); 
        }
    }
    return matrix;
}

int main ()
{
    int row=3, col=2; 

    int (*matrix1)[col] = get_2D_matrix(row, col) ;
    ...

        do_something(matrix1[i][j]);

    ...

    free(matrix); // just one call required.

相关问题