Colocar numeros de precisao ilimitada numa lista encadeada

preciso pegar um numero por extenso e colocar cada digito desse numero em uma lista encadeada
a solução que encontrei para isso foi fazer um ponteiro de string com alocaçao dinamica, converter cada string dentro de um laço e inserir na lista.
estou usando esse codigo mas nao esta inserindo em lista.
Qual e o erro que esta ocasionando isso?
void num_lista(Lista * l, char* cnum) {

  int i,tam,num;
  char str[5];
  cnum = (char *) malloc(sizeof(char));
  //tam = strlen(cnum);
  for(i=0; *(cnum+i) != '\0';i++){
  str[0] = *(cnum+i);
  str[i] = '\0';
  //printf(str);
  printf("teste\n");
  num = atoi(str);
  
  //int v = (int) (cnum[i] > 47 && cnum[i] < 58) ? cnum[i] - 48 : -1;
  //int a = cnum[i] - '0';
  inserir_pos(l, i, num);
  }
}

Você está alocando espaço para apenas 1 char, isso não parece correto, ainda mais se você espera que seu string seja terminado com zero ou seja, só vai caber o \0 ali.

Outra coisa é que você está acessando os dados apontados por cnum (ao fazer *(cnum+i) != '\0') sem ter inicializado ele antes, o que também não parece correto.

como posso resolver isso pois nao quero limitar a quantidade de strings.
sobre a inicializacao eu inicializei no int main pois a variavel cnum e passada como parametro
> int main(void){

          Lista * l1 = criar();
          Lista * l2 = criar();
          Lista * l3 = criar();
          char * cnum1;
          char * cnum2;
          printf("Inserir o numero: ");
          scanf("%s%*c", cnum1);
          printf("Inserir o numero: ");
          scanf("%s%*c", cnum2);
          num_lista(l1,cnum1);
          num_lista(l2,cnum2);
          //l3 = adicao(l1, l2);
          imprimir(l1);
          imprimir(l2);
      
      return 0;
    }

Ta bem confuso o uso de cnum. Tu lê ele usando scanf() mas depois descarta isso dentro do num_lista() e aloca memória nova pra ele com 1 byte e sem inicializar.

O que você tem é entender direito o que você quer fazer e depois ver que funções usar pra implementar o que tu quer fazer, porque eu lendo assim não consigo entender direito nem a intenção do teu programa.

Parece que você só juntou um monte de coisas pra ver no que dava. Por isso na minha opinião, tem que esclarecer as ideias ai.

na verdade eu leio essa variavel atraves do scanf() e a funçao num_lista() pega essa variavel para aplicar a funcao.
o que eu to querendo e que na funçao eu pegue a string com tamanho ilimitado e que cada ponteiro de string aponte para cada caractere, converta isso para inteiro e adicione numa lista.
nao era para aparecer esse um byte e sim ter um tamanho variavel de acordo com o tamanho da string que eu for passar para a funçao. essa e a minha duvida por nao sei como fazer isso.

Você precisa alocar o string antes de passar para scanf(), pois scanf() só vai preencher os valores na memoria já alocada. Dai depois só colocar esse string na lista encadeada.