Вы должны передать указатель digitList
по ссылке на функцию createDigitList
createDigitList(n, &digitList);
В противном случае функция будет иметь дело с копией указателя. Изменение копии не влияет на исходный указатель.
Сама функция должна быть объявлена как минимум как
int createDigitList(int n, int **list) {
int digit, i;
*list = (int*) malloc(nDigits(n)*sizeof(int));
// and so on
Функция должна возвращать размер выделенного массива. В противном случае вызывающая функция не будет знать, сколько элементов содержит массив.
Обратите внимание на то, что функция nDigits
также неверна, поскольку в случае, когда ноль будет передан действительной функции число функция вернет 0
вместо 1
.
Также программа будет некорректно работать, когда пользователь введет отрицательное число. Имеет смысл написать функцию, которая преобразует целое число в строку. В этом случае строка результата может содержать знак минус.
Вот демонстрационная программа, которая показывает, как можно написать такую функцию.
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
size_t nDigits( int n )
{
const int Base = 10;
size_t count = 0;
do { ++count; } while ( n /= Base );
return count;
}
char * createDigitList( int n )
{
const int Base = 10;
size_t count = nDigits( n ) + ( n < 0 );
char *s = calloc( count + 1, sizeof( char ) );
if ( s != NULL )
{
if ( n < 0 ) s[0] = '-';
do
{
int digit = n % Base;
if ( digit < 0 ) digit = -digit;
s[--count] = digit + '0';
} while ( n /= Base );
}
return s;
}
int main(void)
{
printf( "%d is \"%s\"\n", 0, createDigitList( 0 ) );
printf( "%d is \"%s\"\n", INT_MIN, createDigitList( INT_MIN ) );
printf( "%d is \"%s\"\n", INT_MAX, createDigitList( INT_MAX ) );
return 0;
}
Вывод программы:
0 is "0"
-2147483648 is "-2147483648"
2147483647 is "2147483647"