У меня есть цикл, который ищет простые числа в интервале чисел. То, что я хочу сделать, это поместить простые числа в динамический массив, поэтому его начальная длина равна 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 для этого, но приведенный выше код не работает, и я не привык к управлению памятью во время программирования.
ПРИМЕЧАНИЕ. Я знаю о векторах, я хочу сделать это с помощью динамического массива.
realloc
не изменяет передаваемый ему указатель, но возвращает новый указатель:
arr = (int*) realloc(arr,(sizeof(int)*(count + 1)));
Обратите внимание, что вы также должны проверить, произошла ли ошибка:
if(arr == NULL)
break; // or try something else
new
для выделения буфера.
Во-первых, индексирование массива неверно, поэтому вы пишете за пределами своего массива
измените это:
count++;
arr[count] = i;
К этому
arr[count++] = i;
Во-вторых, и я думаю, что не менее важно, вы смешиваете new
и realloc
. Не надо! Используйте malloc/realloc/free
, или new/delete
. Из-за полезного способа работы realloc вы можете заменить начальное new
на int *arr = NULL;
В-третьих, как говорит Паранаикс, вы не назначаете результат realloc
back to arr
.
i++
- это постинкремент, это означает, что i++
возвращает старое значение, а затем инкременты, например, его можно реализовать следующим образом: int operator++(int& var) { int temp = var; var += 1; return temp; }
realloc
вы должны писать наC
а не наC++
.