初学者c代码 - 二维数组的麻烦

时间:2016-02-03 16:20:48

标签: c

我只是试图打印这个矩阵,说实话我不知道为什么我会遇到某些编译器错误。我得到了#34;形式参数不完整"以及M和N未声明的错误。

int print_matrix(int*[][]);

int main()
{
  int N = rand() % 10;
  int M= rand() % 10;
  int matrix[N][M];
  int n; 
  int m;

  for (n=0; n<N; n++)
  {
    for (m=0; m<M; m++)
    {
      matrix[N][M]= rand()%20 +(-10);
    }
  }
  print_matrix(&matrix);

  return 0;
}

int print_matrix(int *matrix[N][M])
{   
  int m;
  int n;

  for (n=0; n<N; n++)
  {
    for (m=0; m<M; m++)
    {
      printf("%2d", matrix[n][m]);
    }
  }

  return 0;
}

1 个答案:

答案 0 :(得分:5)

您的代码中有一些错误,最重要的是您不需要传递数组的地址,如果这样做,您应该在print_matrix()函数中正确处理它。 / p>

以下代码修复了所有问题

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

#define SIZE 10
int print_matrix(int N, int M, int matrix[N][M]);

int
main(void)
{
    int N = rand() % SIZE;
    int M = rand() % SIZE;
    int matrix[N][M];
    int n;
    int m;

    for (n = 0 ; n < N ; n++)
    {
        for (m = 0 ; m < M ; m++)
            matrix[n][m]= rand() % 20 + (-10);
    }
    print_matrix(N, M, matrix);
    return 0;
}

int
print_matrix(int N, int M, int matrix[N][M])
{
    int m;
    int n;
    for (n = 0 ; n < N ; n++)
    {
        for (m = 0 ; m < M ; m++)
            printf("%5d ", matrix[n][m]);
        fputc('\n', stdout);
    }
    return 0;
}

我现在解释我修复的内容

  1. 将行数和列数传递给print_matrix()
  2. 分配矩阵元素时出现了另一个错误,您使用了大写NM,因此您总是在数组中的最后一个元素之后访问该元素。
  3. 分别从函数调用和它的defenition中删除&*,当数组是函数的参数时,数组自动转换为指针,尝试sizeof(matrix)然后你可以验证它与sizeof(void *)相同。
  4. 你可以这样做

    int
    print_matrix(int N, int M, int matrix[N][M])
    

    因为你也可以这样做

    int N = rand() % SIZE;
    int M = rand() % SIZE;
    int matrix[N][M];
    

    反之亦然。