Problema allocazione dinamica della memoria

Ragazzi ho cominciato a implementare un lista concatenata e ho un problema: cerco di allocare uno struct che contiene due puntatori a carattere(stringhe) e... una volta allocata la seconda stringa, la prima viene compromessa e non riesco a capire perché! Ecco le inizializzazioni per la lista:

struct variabile {
  char *nome;
  char *valore;
  char tipo;
  struct variabile *prox;
  };
typedef struct variabile listaVar;
listaVar *ricerca, *testa;

Ed ecco la routine che usa la lista concatenata, per ora è in grado di scrivere solo la testa della lista. Prende in ingresso una stringa precedentemente processata con la funzione "strtok":

void creaVar(char *inp) {
  int i;
  if(testa == NULL) {
    ricerca = (listaVar*)malloc(sizeof(listaVar));
    ricerca -> nome = (char*)malloc(sizeof());
    strcpy(ricerca -> nome, inp);
    Serial.print("nomeV: ");
    Serial.println(ricerca -> nome);

    for(; *inp != '\0';) {
      inp ++;
      }
    inp ++;
    ricerca -> valore = (char*)malloc(sizeof(strlen(inp)));
    strcpy(ricerca -> valore, inp);
    Serial.print("Val.V: ");
    Serial.println(ricerca -> valore);
    ricerca -> tipo = 'n';
    for(i = 0; i < strlen(ricerca -> valore); i ++) {
      if(*(ricerca -> valore) < 48 || *(ricerca -> valore) > 57) {
        ricerca -> tipo = 's';
        break;
        }
      }
    ricerca -> prox = NULL;
    testa = ricerca;
    }
  }

Ok, la funzione va alla grande, ma se ad esempio do in ingresso una stringa del tipo "nome\0valore\0", la stringa "nome" viene correttamente memorizzata ma quando vado a memorizzare la stringa "valore" la stringa precedente viene compromessa, da "blabla" diventa "b\0", oppure da "ciao" diventa "c\0".
Lo stesso identico codice implementato per PC (sostituendo Serial.print con printf...) funziona perfettamente e sull'Arduino il problema si risolve usando una allocazione fissa per il campo "nome", ma è una cosa che vorrei veramente evitare visto che porta un gran spreco di memoria.
Spero possiate aiutarmi a capire cosa non va.
Grazie, ciao :slight_smile:

niente? :frowning:

Ciao MGuru,
io il C l'ho un po' rimosso, ma grazie all'obj-c e ad Arduino l'ho dovuto riprendere in mano.
Ti metto la pulce nell'orecchio c'è qulche cosa che non mi convince in come hai allocato la memoria. Di fatto tu usi strcpy che copia una stringa in un'altra senza verificare se la stringa di destinazione va a sovrascrivere una zona di memoria già occupata. Tra l'altro se la sintassi non mi inganna allochi ad un puntatore (*nome) alla sua stessa lunghezza. Forse è meglio che prima esamini la lunghezza di una e poi la copi in un nuovo blocco allocato dinamicamente.
Da vecchie lezioni tra l'altro mi ricordo che nel campo dei uC è sempre meglio usare funzioni di get e put char rispetto a quelle più complesse di printf e scanf che esistono anche "seriali".ù

Spero di esserti stato di aiuto, anche perchè non sono un espertone di C, ma l'ho ripreso in mano da poco.
Ciao

Grazie mille Drama, avevo lasciato perdere da un po' ora mi rimetto a lavoro :slight_smile:
Ciao e grazie a ancora