Обе версии кода содержат ошибки.
В первой версии у вас есть это:
int i, *divisors = 0, divisor_number;
divisors = calloc(divisor_number, sizeof *divisors);
Здесь divisor_number
не инициализирован, поэтому его значение неопределенно . Простое использование значения вызывает неопределенное поведение . Вам «повезло», что все работает, либо потому, что значение, которое случайно было передано в calloc
, было достаточно большим, чтобы выделить достаточно памяти, либо потому, что оно недостаточно велико, и вам удалось ничего не сломать, написав за конец выделенной памяти.
Во втором коде:
divisors[i-1] = i;
printf("%d\n", divisors[i-1]);
divisor_number++;
В этот момент divisiors
установлен в NULL, поэтому вы разыменовываете указатель NULL, что также является неопределенным поведением. Кроме того, как и в первом коде, divisor_number
не инициализирован, но вы пытаетесь его увеличить.
Ваш опубликованный ответ также не работает, потому что вы говорите calloc
выделить 0 байт памяти, поэтому любой доступ к элементу выделенного массива - это чтение после конца.
Вместо этого вы должны использовать значение, считанное в int_number
, для выделения памяти и вызывать calloc
сразу после этого. Это реальный объем места, который вам нужен.
int* save_number(int *int_number)
{
int i, *divisors = 0;
scanf("%d", int_number);
divisors = calloc(*int_number, sizeof *divisors);
for (i = 1; i <= *int_number; ++i)
{
if (*int_number % i == 0)
{
divisors[i-1] = i;
printf("%d\n", divisors[i-1]);
}
}
return divisors;
}