Как создать массив переменной длины в C в среде Visual Studio 2010? - PullRequest
1 голос
/ 29 мая 2019

Я хочу создать массив переменной длины для своего кода в среде Visual Studio 2010.

Я пробовал код, используя массив длины x, так как он передается пользователем. Но я сталкиваюсь с ошибкой как:

"ошибка C2466: невозможно выделить массив постоянного размера 0", "ошибка C2133: 'v_X_array': неизвестный размер".

func1(int x)
{
    int v_X_array[x];
    int i;
    for (i=0; i<x; i++)
    {
        v_X_array[i] = i;
    }
}

Я ожидаю ответа как v_X_array[0] = 0, v_X_array[1] =1, v_X_array[2]=2 ... v_X_array[10]=10; для x = 10;

Как я могу это сделать?

Примечание: поскольку calloc и malloc не должны использоваться.

Ответы [ 2 ]

0 голосов
/ 29 мая 2019

Вы не можете выделить массив неизвестного размера.Поэтому вам нужно динамически распределять его «во время выполнения».Вы можете сделать это распределение, используя «new» в C ++ или «malloc» в C.

Например:

В C ++, если вы хотите выделить массив неизвестного размера, вы должны сделатьследующее:

int* v_X_array = new int[x];
int i;
for (i=0; i<x; i++)
{
    v_X_array[i] = i;
}

Причина, по которой мы используем целочисленный указатель, заключается в том, что «new» возвращает базовый адрес массива, «адрес первого элемента», поэтому единственное, что может хранить адреса, - это указатели.

В C, если вы хотите выделить массив неизвестного размера, вы должны сделать следующее:

    int* v_X_array = (int*) malloc(x*sizeof(int));
    int i;
    for(i=0; i<x; i++)
    {
        v_X_array[i] = i;
    }

Функция malloc принимает один аргумент, который определяет количество байтов длябыть выделенным и возвращает пустой указатель, поэтому требуется приведение (int *).

Для получения дополнительных объяснений посмотрите следующий раздел:

Если нам нужно выделить массив из 20 целых чисел,может быть следующим: «malloc (20 * sizeof (int))», где 20 - количество выделенных элементов, а sizeof (int) - размер типа, который вы хотите выделить.В случае успеха он возвращает указатель на выделенную память.В случае сбоя возвращается нулевой указатель.

Введите описание изображения здесь

0 голосов
/ 29 мая 2019

Если вам нужен переносимый код, вы не можете использовать такое определение массива для обработки областей памяти.

Не вдаваясь в конкретные реализации, у вас есть два общих подхода, которые вы можете использовать:

  1. Определите массив, достаточно большой для худшего случая. Это сильно зависит от приложения, поэтому вы сами по себе.
  2. Определите «массив» с помощью динамического выделения. С его помощью вы можете определять области памяти любого произвольного размера.

Если вы выберете вариант 2:

а. Не забудьте освободить память, когда она вам больше не нужна.

б. Чтобы избежать частого выделения и перераспределения, вы можете определить буфер один раз (возможно, больше, чем необходимо для текущего вызова) и использовать его несколько раз. Вы можете получить тот же результат, что и в варианте 1 выше - определить большой массив с самого начала.


Поскольку вы не должны использовать динамическое размещение («не должны использоваться calloc и malloc»), то у вас остается опция 1.


Я ожидаю ответа как v_X_array [0] = 0 , v_X_array [1] = 1, v_X_array [2] = 2 ... v_X_array [10] = 10 ; для x = 10 ;

Вы ожидаете сохранить 11 значений в массиве, который может содержать только 10?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...