[英]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);
}
這段代碼有很多問題。
主要的:
matrix = (int**)malloc(n * sizeof(n));
您的兩個 malloc 調用都很奇怪, n
只是一個大小參數(也可以是size_t
)並且不一定與數據具有相同的類型。 在這種情況下是int*
,而不是int
。 你應該分配像matrix = malloc(n * sizeof(*matrix))
這樣的東西for (int i = 0; i < m; i++)
是錯誤的,應該是n
。次要的:
matrix
初始化為 NULL。 與 NULL 相比,您還有多項冗余檢查。*(matrix + i)
從來都不是訪問 C 數組的最佳方式,它只是一種晦澀的寫法matrix[i]
。 不要為了它而把事情復雜化。n
和m
,然后在另一個 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))
當您想創建一個指向int
的n
指針數組時,這是沒有意義的。 在 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.