繁体   English   中英

在 C 中打印 function 中的二维数组

[英]Printing a 2-D array in a function in C

我想在两个单独的函数中初始化和打印一个二维数组,但我真的不知道我是否正确地这样做了。

我写了 2 个函数: int** matrix_initialization(int n, int m)int print_matrix(int n1, int n2, int **a);

在第一个 function 中,我必须为 arguments:int n - 行数和 int m - 列数。 在这个 function 中,我初始化一个指向指针int **matrix = NULL; 然后我给它分配 memory,并给这个二维数组随机值。

int** matrix_initialization(int n, int m) function 的类型是int **可以吗?

第二个 function 是int print_matrix(int n1, int n2, int** a)并且有一些问题,主要是它不起作用。 我有三个 arguments int n1 - rows, int n2 - cols, int** a指向指针的指针。 这个function是用来打印矩阵的。

这是我的代码:

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

int** matrix_initialization(int n, int m)
{
    int** matrix = NULL;
    matrix = (int**)malloc(n * sizeof(n));
    if (matrix != NULL)
    {
        if (matrix != NULL)
        {
            for (int i = 0; i < m; i++)
            {
                *(matrix + i) = (int*)malloc(m * sizeof(m));
            }

            for (int i = 0; i < n; i++)
            {
                for (int j = 0; j < m; j++)
                {
                    matrix[i][j] = rand() % 20 - 5;
                }
            }
        }
    }
    return matrix;
}

int print_matrix(int n1, int n2, int** a)
{
    for (int i = 0; i < n1; i++)
    {
        for (int j = 0; j < n2; j++)
        {
            printf("%d\t", a[i][j]);
        }
        printf("\n");
    }
}

int main()
{           
srand(time(NULL));      
int N, M, **a;
scanf_s("%d %d", &N, &M);       
a = matrix_initialization(N, M);        
print_matrix(N, M, a);
    
}

这段代码有很多问题。

主要的:

  • 您使用的不是 2D arrays,而是 arrays 指针。 这对这个应用程序没有任何意义,你只是让你的代码更复杂,更容易出错并且更慢而完全没有任何收获。 请参阅正确分配多维 arrays
  • matrix = (int**)malloc(n * sizeof(n)); 您的两个 malloc 调用都很奇怪, n只是一个大小参数(也可以是size_t )并且不一定与数据具有相同的类型。 在这种情况下是int* ,而不是int 你应该分配像matrix = malloc(n * sizeof(*matrix))这样的东西
  • 第一个 for 循环for (int i = 0; i < m; i++)是错误的,应该是n
  • 您没有释放分配的 memory。

次要的:

  • 此程序不需要 locale.h。
  • 如果要在下一行分配给它,则实际上不需要将指针matrix初始化为 NULL。 与 NULL 相比,您还有多项冗余检查。
  • *(matrix + i)从来都不是访问 C 数组的最佳方式,它只是一种晦涩的写法matrix[i] 不要为了它而把事情复杂化。
  • 不要在一个 function 中命名参数nm ,然后在另一个 function 中命名参数n1 n2 。不要为了它而把事情复杂化。
  • 避免以_s结尾的函数,除非您有特定原因需要使用它们。 它们是不可携带的。 很有可能告诉您使用它的人根本不知道他们在说什么。 包括对 C11 中整个“边界检查接口”崩溃一无所知。
  • int main()是过时的样式,始终使用int main (void) (与 C++ 相对)。

这是修复了所有问题的重写,改为使用 2D arrays:

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

void* matrix_initialization (int n, int m)
{
  int (*matrix)[m] = malloc( sizeof(int[n][m]) );
  if (matrix != NULL)
  {
    for (int i = 0; i < n; i++)
    {
      for (int j = 0; j < m; j++)
      {
          matrix[i][j] = rand() % 20 - 5;
      }
    }
  }
  return matrix;
}

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

int main (void)
{           
  srand(time(NULL));      
  int N, M;
  scanf("%d %d", &N, &M);
  int (*a)[M];
  a = matrix_initialization(N, M);
  print_matrix(N, M, a);
  free(a);
}

你有两个主要问题:

第一个是

malloc(n * sizeof(n))

这与

malloc(n * sizeof(int))

当您想创建一个指向intn指针数组时,这是没有意义的。 在 64 位系统上, sizeof(int) == sizeof(int *)不太可能。

它应该是

malloc(n * sizeof(int*))

或者更好

malloc(n * sizeof *matrix)

第二个问题是你分配int arrays 的循环:

for (int i = 0; i < m; i++)

您刚刚创建了一个包含n元素的数组。 现在你遍历m个元素? 这仅在n == m时有效。

正确的循环当然应该是

// Iterating over an array of n elements
for (int i = 0; i < n; i++)

上面提到的malloc调用也有同样的问题,但这次它恰好有效,因为m是一个类型和大小正确的int


另外几点注意,在 C 中,您不应投射malloc的结果

您永远不会free您分配的任何数据,从而导致 memory 泄漏。

而不是*(matrix + i)使用matrix[i]

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

int** matrix_initialization(int n, int m)
{
    int** matrix = NULL;
    //matrix = (int**)malloc(n * sizeof(n));
    matrix = (int**)malloc(n * sizeof(int *));

    if (matrix != NULL)
    {
        for (int i = 0; i < n; i++)//here is n,not m
        {
            matrix[i] = (int*)malloc(m * sizeof(int));
        }

        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < m; j++)
            {
                matrix[i][j] = rand() % 20 - 5;
            }
        }
    }

    return matrix;
}

int print_matrix(int n1, int n2, int** a)
{
    for (int i = 0; i < n1; i++)
    {
        for (int j = 0; j < n2; j++)
        {
            printf("%d\t", a[i][j]);
        }
        printf("\n");
    }
    return 0;
}

int main()
{
    srand(time(NULL));
    int N, M, **a,i;
    scanf("%d %d", &N, &M);
    a = matrix_initialization(N, M);
    print_matrix(N, M, a);
    //free all the memory
    for (i = 0; i<N; i++) {
        free(a[i]);
    }
    free(a);
    return 0;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM