簡體   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