如何初始化其中大小由argc和argv确定的2D数组?

问题描述 投票:3回答:2

我正在研究代码,它将跟踪每次访问数组中的特定元素。数组本身将根据用户的输入动态分配,因此我所看到的功能都不是我正在寻找的。更具体地说,如何动态分配数组的行和列,然后将每个元素初始化为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的任何指针吗?编辑:我添加了我尝试建立数组的行

c dynamic-memory-allocation
2个回答
2
投票

此程序使用命令行参数分配内存,并创建可使用数组语法访问的变量。它使用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告诉编译器输出文件的名称。


2
投票

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.对不起我的英语,我希望有人会把它修好为人类可读的英语。

© www.soinside.com 2019 - 2024. All rights reserved.