Как инициализировать двумерный массив, в котором размер определяется argc и argv? - PullRequest
3 голосов
/ 15 марта 2019

Я работаю над кодом, который будет отслеживать каждый раз, когда к конкретному элементу массива обращаются. Сам массив будет распределяться динамически на основе входных данных пользователя, поэтому никакие функции, которые я видел, не являются тем, что я ищу. Чтобы быть более конкретным, как я могу динамически распределить строки и столбцы массива, а затем инициализировать каждый элемент в 0? Ex.
./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? редактировать: я добавил строку, где я пытаюсь установить массив

Ответы [ 2 ]

2 голосов
/ 15 марта 2019

Эта программа выделяет память, используя параметры командной строки, и создает переменную, доступ к которой осуществляется с использованием синтаксиса массива.Он использует 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 голосов
/ 15 марта 2019

Неважно, 1D, 2D или ND. Вы можете использовать две стратегии:

Первый - создать простой одномерный массив как

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.S. Некоторые современные компиляторы позволяют инициализировать динамический массив как статический, но у этого кода могут возникнуть проблемы, когда вы попытаетесь скомпилировать его в другой среде.
P.P.S. Извините за мой английский, я надеюсь, что кто-то установит его на понятный человеку английский.

...