在malloc之后将2d数组传递给函数时出错

sdnqo3pr  于 2023-01-20  发布在  其他
关注(0)|答案(2)|浏览(122)

在很长一段时间的缺席之后,我最近又回到了C语言中,我一辈子都记不起如何将一个2D矩阵传递给一个函数,并在错位之后使用它。我相信我已经正确地传递了指针,但我似乎无法实际访问矩阵中的任何东西,也不知道为什么。
这是我写的:

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

void matrixOperation(int *arr, int m, int n)
{
    
    printf("in matrixOperation\n ");
    int i, j;
    for (i = 0; i < m; i++)
      for (j = 0; j < n; j++)
        printf("%d\n", *((arr+i*n) + j));
}
 
int main()
{
    int i,j,count;
    int row, col;
    
    
    //------------------------------
    printf("Number of rows?\n  ");
    scanf("%d", &row);
    
    printf("Number of columns?\n  ");
    scanf("%d", &col);
    
    //------------------------------
    
    
    int* arr[row];
    for (i = 0; i < row; i++)
        arr[i] = (int*)malloc(col * sizeof(int));
    
    count = 0;
    for (i = 0; i < row; i++)
        for (j = 0; j < col; j++)
            arr[i][j] = ++count;
 
 
 for (i = 0; i < row; i++)
        for (j = 0; j < col; j++)
            printf("%d\n",arr[i][j]);
 
 
 
    // We can also use "print(&arr[0][0], m, n);"
    matrixOperation((int *)arr, row, col);
    
    for (int i = 0; i < row; i++)
        free(arr[i]);
    
    
    return 0;
}

我们的目标是让它接受用户输入的矩阵大小,用一个计数填充每个索引,然后将其传递给一个函数,该函数将其打印出来。然而,当我尝试使用它时,print语句只是输出随机数,我认为这些随机数就是指针所指向的。
我希望matrixOperation输出与main中的print语句相同的内容,但我不知道我做错了什么。

ukqbszuj

ukqbszuj1#

更改函数签名,您应该能够使用相同的代码段。

void matrixOperation(int **arr, int m, int n)
{
    for (i = 0; i < m; i++)
        for (j = 0; j < n; j++)
            printf("%d\n",arr[i][j]);
}

致电:

matrixOperation(arr, row, col);

记住,当一个数组被传递给一个函数时,它会“衰减”成一个指针。你有一个指针数组。它衰减成一个指向指针的指针。

2o7dmzc5

2o7dmzc52#

你声明了一个指针数组

int* arr[row];

所以把这个数组传递给函数。
函数将声明为

void matrixOperation(int **arr, int m, int n)
{
    
    printf("in matrixOperation\n ");
    int i, j;
    for (i = 0; i < m; i++)
      for (j = 0; j < n; j++)
        printf("%d\n", *( *( arr + i ) + j ) );
}

并调用如下函数

matrixOperation( arr, row, col );

尽管这样定义函数会更好

void matrixOperation(int **arr, int m, int n)
{
    printf("in matrixOperation\n ");

    for ( int i = 0; i < m; i++ )
    {
        for ( int j = 0; j < n; j++ )
        {
            printf("%d ", *( *( arr + i ) + j ) );
        }
        putchar( '\n' );
    }
}

请注意,这个表达式带有指针运算

*( *( arr + i ) + j )

可以使用下标运算符按以下方式重写

arr[i][j]

这两个表达式彼此等价。
至于通过强制转换数组指示符调用函数

matrixOperation((int *)arr, row, col);

那么它是错误的,因为你没有一个内存范围。你分配了几个内存范围。

相关问题