Salve, dopo aver letto la guida, e usufruito della conoscenza degli utenti sul forum , ho ho provato a fare la somma di numeri binari, niente di complicato sopratutto per chi se ne intende ( XD ), però anche se funziona ci sono delle cose di cui non sono sicuro:

codice:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

int main()
{
    int n;  //numero di bit dei numeri
    int c;  //variabile di conteggio delle varie istruzioni
    int o;  //variabile per invertire la posizione gli array
    int riporto;   //variabile per il riporto della somma binaria
    char *c_bit1;  //puntatore per la stringa del primo numero binario
    char *c_bit2;   //puntatore per la stringa del secondo numero binario
    int *bit1;     //puntatore per i numeri del primo numero binario
    int *bit2;     //puntatore per i numeri del secondo numero binario
    int *somma;    //puntatore per i numeri del numero della somma
    
    printf("inserire il numero di bit di ogni numero\n");  
    scanf("%d", &n);
    
    c_bit1 = (char *)malloc(sizeof(char) * n);  //Allocazione blocco di n bit per la stringa
    if(c_bit1 == NULL)
    {
              printf("Memoria esaurita");
              return(0);
              }
    
    printf("\nInserire il primo numero di %d bit\n", n);
    scanf("%s", &*c_bit1);                                //Lettura della stringa
    
    bit1 = (int *)malloc(sizeof(int) * n);       //Allocazione blocco di n bit per il numero 
    if(bit1 == NULL)
    {
              printf("Memoria esaurita");
              return(0);
              }
    
    o = (n - 1);  // Utilizzata per invertire la locazione della variabile nell'array
    
    for(c = 0; c < n; c++)
    {
          bit1[c] = (int)c_bit1[o];    //Assegnazione (con posizione invertita 0 a 3, 1 a 2...) del valore
          o--;                        // in ASCII della stringa
    }
    
    free(c_bit1);
    
    for (c = 0; c < n; c++)
    {
        if (bit1[c] == 48)      //Conversione da codice ASCII ad intero associato
        bit1[c] = 0;
        else if(bit1[c] == 49)
        bit1[c] = 1;
        else
        {
            printf("\nE' stato inserito un carattere errato (%d)", bit1[c]);   
            return(0);               // Se viene inserito un carattere differente da '0' o '1'
        }
    } 
    
    c_bit2 = (char *)malloc(sizeof(char) * n); //Memoria per la seconda stringa
    if(c_bit2 == NULL)
    {
              printf("Memoria esaurita");
              return(0);
              }
    
    printf("\nInserire il secondo numero di %d bit\n", n); //lettura stringa
    scanf("%s", &*c_bit2);
    
    bit2 = (int *)malloc(sizeof(int) * n);  //Memoria per il secondo numero
    if(bit2 == NULL)
    {
              printf("Memoria esaurita");
              return(0);
              }
    
    o = (n - 1);  // Utilizzata per invertire 
    
    for (c = 0; c < n; c++)
    {
        bit2[c] = (int)c_bit2[o];    //Assegnazione (con posizione invertita 0 a 3, 1 a 2...) del valore
        o--;                        // in ASCII della stringa
    }
    
    free(c_bit2);         //Liberazione memoria
    
    for (c = 0; c < n; c++)
    {
        if(bit2[c] == 48)       //Conversione ASCII to intero
        bit2[c] = 0;
        else if (bit2[c] == 49)
        bit2[c] = 1;
        else
        {
            printf("\nE' stato inserito un carattere errato (%d)", bit2[c]);
            return(0);
        }
    } 
    
    somma = (int *)malloc(sizeof(int) * n); //Memoria per somma
    riporto = 0;
    
    for(c = 0; c < n; c++)  //Calcolo della somma binaria
    {
          somma[c] = bit1[c] + bit2[c] + riporto;
          
          if(somma[c] == 0)      
          riporto = 0;
          else if(somma[c] == 1)
          riporto = 0;
          else if(somma[c] == 2)
          {
               somma[c] = 0;
               riporto = 1;
          }
          else if(somma[c] == 3)
          {
               somma[c] = 1;
               riporto = 1;
          }
    }
    
    free(bit1);   //liberazione memoria
    free(bit2);
    printf("\n");
    if (riporto == 1)
    printf("1");        //stampa se presente il riporto finale
    for(c = (n - 1); c >= 0; c--)
    printf("%d", somma[c]); //stamma le cifre della somma
    
    getchar();
    getchar();
}
Prima di tutto non è che c'è un modo per eliminare il passaggio di scambio tra c_bit1 e bit1 e quindi anche il convertitore da ASCII utilizzando direttamente i dati in ingresso? (prelevandoli sempre come stringa e non bit per bit).
Secondo, utilizzo della variabile 'o' non è che c'è un modo più sensato?
L'utilizzo di malloc è corretto (o almeno abbastanza XD)?

Grazie in anticipo, spero che il titolo vada bene