[英]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.