Один из моих одноклассников прислал мне код и спросил, что с ним не так. Это было примерно так:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int *d_array, number, divisor_count, i, size = 1;
char answer;
d_array = (int*) malloc(size * sizeof(int));
do
{
printf("\nEnter a number: ");
scanf("%d", &number);
divisor_count = 0;
for(i = 2; i < number; i++)
if (number % i == 0) divisor_count++;
if(divisor_count == 0)
{
realloc(d_array,(size + 1) * sizeof(int));
d_array[size - 1] = number;
size++;
}
printf("\nIs there another number? y/n ");
getchar();
answer = getchar();
} while (answer == 'y');
for(i = 0; i < size - 1; i++)
printf("\n%d", d_array[i]);
return 0;
}
Он должен получить числа от пользователя и сохранить те, которые являются простыми, и напечатать их в конце. Вывод на моем компьютере выглядит примерно так:
Enter a number: 3
Is there another number? y/n y
Enter a number: 5
Is there another number? y/n y
Enter a number: 8
Is there another number? y/n y
Enter a number: 7
Is there another number? y/n y
Enter a number: 2
Is there another number? y/n n
4072680
5
7
2
В коде были и другие вещи, но самая большая проблема, очевидно, заключается в том, что не присваивается возвращаемое значение realloc(). Но странно то, что это мой вопрос, почему этот код показывает первое простое число неправильно, а остальные правильно? Возможно, адрес динамического массива меняется, но почему второй и остальные правильные, а не первый?
Редактировать: Хорошо, причина, по которой я задал этот вопрос, заключалась в том, чтобы попытаться понять поведение realloc() в этом коде, если у вас есть хорошие ресурсы, поделитесь ими. При перераспределении памяти (когда она освобождает старую) изменяет ли realloc() содержимое старой ячейки памяти?