Мне нужно выделить массив целых чисел внутри функции, а затем вернуть его. Проблема в том, что я не знаю, сколько памяти мне нужно выделить: это может быть 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
, в том же указателе, который указан в качестве аргумента?
И это хороший способ создать массив размера, определенного во время выполнения?
Вы правы, я собираюсь изменить заголовок на «целые числа».
Сохранение адреса, возвращенного из 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]
перед увеличением массива. Это УБ?
Нет, первоначальное распределение sizeof(long long) * 4
. Извините, если я не опубликовал достаточно контекста
В заголовке написано «Массив целых чисел», но в вашем коде используется
sizeof(long long)
. Что вы на самом деле хотите использовать?