我正在研究代码,它将跟踪每次访问数组中的特定元素。数组本身将根据用户的输入动态分配,因此我所看到的功能都不是我正在寻找的。更具体地说,如何动态分配数组的行和列,然后将每个元素初始化为0?防爆。 ./SIM A B.
int* array_columns = malloc(atoi(argv[1]) * sizeof(int));
int* array_rows = malloc(atoi(argv[2]) * sizeof(int));
int array[*array_rows][*array_columns];
我所看到的一切都需要事先知道每行/每列中的元素数量。任何人都可以提供有关如何将此数组初始化为0的任何指针吗?编辑:我添加了我尝试建立数组的行
此程序使用命令行参数分配内存,并创建可使用数组语法访问的变量。它使用calloc
将值初始化为零:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int **array;
int length = atoi(argv[1]);
int width = atoi(argv[2]);
array = calloc(length, sizeof(int *));
for (int i = 0; i < length; i++) {
array[i] = calloc(width, sizeof(int));
}
for (int i = 0; i < length; i++) {
for (int j = 0; j < width; j++) {
printf("array[%d][%d] = %d\n", i, j, array[i][j]);
}
}
for (int i = 0; i < length; i++) {
free(array[i]);
}
free(array);
return 0;
}
编译
gcc -Wall -Werror -o scratch scratch.c
产量
[user@machine]: ./scratch 3 5
array[0][0] = 0
array[0][1] = 0
array[0][2] = 0
array[0][3] = 0
array[0][4] = 0
array[1][0] = 0
array[1][1] = 0
array[1][2] = 0
array[1][3] = 0
array[1][4] = 0
array[2][0] = 0
array[2][1] = 0
array[2][2] = 0
array[2][3] = 0
array[2][4] = 0
注意
我省略了输入验证和错误检查以保持示例小。
编译器选项
我使用-Wall -Werror
打开所有警告并将其视为错误。这意味着除非修复了所有警告原因,否则编译器不会生成可执行文件。 -o scratch
告诉编译器输出文件的名称。
1D,2D或AND无关紧要。您可以使用两种策略:
第一个是创建一个简单的1D数组
int *a = (int *)malloc(atoi(argv[1]) * atoi(argv[2]) * sizeof(int));
第二个是创建一个数组数组,如下所示:
int len = atoi(argv[1]);
int len2 = atoi(argv[2]);
int **a = (int **)malloc(len * sizeof(int *));
for (int i = 0; i < len; ++i) {
a[i] = (int *)malloc(len2 * sizeof(int));
}
第一个变体为您提供了一种初始化和删除数组的简单方法,第二个变体可以允许创建更大的数组,因为在这种情况下,子数组的内存块可以保留在内存的不同位置。
要通过某种值初始化它,请使用memset
。
对于1D阵列:
memset(a, 0, sizeof(int) * len * len2);
对于数组数组:
for (int i = 0; i < len; ++i) {
memset(a[i], 0, sizeof(int) * len2);
}
附:一些现代编译器允许您将动态数组初始化为静态,但是当您尝试在另一个环境中编译它时,该代码可能会遇到麻烦。 P.P.S.对不起我的英语,我希望有人会把它修好为人类可读的英语。