Увеличение размера динамически размещаемого массива в цикле

0

У меня есть цикл, который ищет простые числа в интервале чисел. То, что я хочу сделать, это поместить простые числа в динамический массив, поэтому его начальная длина равна 1, и когда я нахожу второе число, я хочу перераспределить память, чтобы массив мог удерживать 2 числа вместо одного и так далее. Код, который у меня есть, выглядит следующим образом:

int *arr = new int[1];

int count = 0;
for(int i = 0; i <= x; i++) // (x is a value given by the user)
{
    if (is_prime(i))
    {
        realloc(arr,(sizeof(int)*(count + 1)));
        count++;
        arr[count] = i;
    }
}

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

ПРИМЕЧАНИЕ. Я знаю о векторах, я хочу сделать это с помощью динамического массива.

  • 2
    Никогда не смешивайте новые / удаляйте с malloc / free / realloc
  • 0
    Если вы должны использовать realloc вы должны писать на C а не на C++ .
Показать ещё 2 комментария
Теги:

2 ответа

2
Лучший ответ

realloc не изменяет передаваемый ему указатель, но возвращает новый указатель:

arr = (int*) realloc(arr,(sizeof(int)*(count + 1)));

Обратите внимание, что вы также должны проверить, произошла ли ошибка:

if(arr == NULL)
    break; // or try something else
  • 0
    Кстати, OP использует new для выделения буфера.
  • 0
    @ Паранакс действительно! два других вопроса ударили меня по лицу, и я этого не заметил!
Показать ещё 5 комментариев
3

Во-первых, индексирование массива неверно, поэтому вы пишете за пределами своего массива

измените это:

count++;
arr[count] = i;

К этому

arr[count++] = i;

Во-вторых, и я думаю, что не менее важно, вы смешиваете new и realloc. Не надо! Используйте malloc/realloc/free, или new/delete. Из-за полезного способа работы realloc вы можете заменить начальное new на int *arr = NULL;

В-третьих, как говорит Паранаикс, вы не назначаете результат realloc back to arr.

  • 0
    Хорошо, есть ли разница между увеличением количества вначале и увеличением в скобках массива?
  • 1
    @Jacco i++ - это постинкремент, это означает, что i++ возвращает старое значение, а затем инкременты, например, его можно реализовать следующим образом: int operator++(int& var) { int temp = var; var += 1; return temp; }

Ещё вопросы

Сообщество Overcoder
Наверх
Меню