Массив целых чисел с длиной, определенной во время выполнения

Мне нужно выделить массив целых чисел внутри функции, а затем вернуть его. Проблема в том, что я не знаю, сколько памяти мне нужно выделить: это может быть sizeof(int)*3, так как это может быть больше памяти, чем у меня есть.

Поскольку выделение большого куска памяти, который может быть избыточным или недостаточным, не является хорошим решением, я собираюсь использовать realloc в первый раз.

Теперь мне нужно использовать его в таком цикле

for(i = 3; (res[i] = res[i-3] - res[i-2] - res[i-1]) >= 0; i++) {
    
    res = realloc( res, sizeof(long long) * (i+2) );
}

Можно ли хранить адрес, возвращенный из realloc, в том же указателе, который указан в качестве аргумента?

И это хороший способ создать массив размера, определенного во время выполнения?

В заголовке написано «Массив целых чисел», но в вашем коде используется sizeof(long long). Что вы на самом деле хотите использовать?

MikeCAT 24.12.2020 20:21

Вы правы, я собираюсь изменить заголовок на «целые числа».

anotherOne 24.12.2020 20:24
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
0
2
80
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Сохранение адреса, возвращенного из realloc, в том же указателе, указанном в качестве аргумента, разрешено, но это не очень хороший способ, поскольку это предотвратит освобождение выделенной памяти в случае сбоя realloc.

Хорошо сначала сохранить результат в другой указатель и присвоить его исходной переменной после проверки, не является ли указатель NULL.

for(i = 3; (res[i] = res[i-3] - res[i-2] - res[i-1]) >= 0; i++) {
    
    long long* new_res = realloc( res, sizeof(long long) * (i+2) );
    if (new_res == NULL) {
        /* handle error (print error message, free res, exit program, etc.) */
    } else {
        res = new_res;
    }
}

Я предполагаю, что начальное распределение равно 3. Итак, условие в for присваивает значение res[i] перед увеличением массива. Это УБ?

Craig Estey 24.12.2020 20:22

Нет, первоначальное распределение sizeof(long long) * 4. Извините, если я не опубликовал достаточно контекста

anotherOne 24.12.2020 20:27

Другие вопросы по теме