Problema struct con puntatore char

di il
3 risposte

Problema struct con puntatore char

Salve a tutti ragazzi, ho il seguente problema ho un struttura simile a questa:
typedef struct {
		int d;
		char *nome;
	}prova_t;
Ora io uso la funzione strtok per prelevare un valore da una stringa esempio:

	char * tmp;
	prova_t* p = (prova_t *)malloc(sizeof(prova_t));
	p->d = ((tmp = strtok(buffer, " ") != NULL) ? strtod(tmp,NULL) : 0);
	p->nome = strtok(NULL," "); 
	printf("%s, %d\n",p->d,p->nome);
Ora avendo verificato che strtok non restituisce NULL, e che la printf stampa valori corretti, se da main faccio una printf di p->nome viene resituito un valore "sporco" della memoria, mentre di p->d il valore corretto, come potrei fare? E per quale motivo fa cosi?

Grazie

3 Risposte

  • Re: Problema struct con puntatore char

    Il codice che hai scritto è molto complesso da capire, magari dovresti provare a scriverlo in maniera più leggibile.
    Ad ogni modo dovresti mostrare più codice perchè altrimenti non si capisce dov'è il problema (ad esempio: cos'è buffer?).
    Il problema è probabilmente nella struttura: il puntatore p potrebbe puntare ad una variabile/stringa locale (e quindi presente sullo stack) il cui contenuto non è garantito uscendo dalla funzione; molto meglio sarebbe avere una struttura di questo tipo:
    #define MAXSTR	80
    typedef struct {
          int d;
          char nome[MAXSTR];
    }prova_t;
    e nome lo carichi con una strcpy() (o meglio ancora, strncpy()).
  • Re: Problema struct con puntatore char

    candaluar ha scritto:


    Il codice che hai scritto è molto complesso da capire, magari dovresti provare a scriverlo in maniera più leggibile.
    Ad ogni modo dovresti mostrare più codice perchè altrimenti non si capisce dov'è il problema (ad esempio: cos'è buffer?).
    Il problema è probabilmente nella struttura: il puntatore p potrebbe puntare ad una variabile/stringa locale (e quindi presente sullo stack) il cui contenuto non è garantito uscendo dalla funzione; molto meglio sarebbe avere una struttura di questo tipo:
    #define MAXSTR	80
    typedef struct {
          int d;
          char nome[MAXSTR];
    }prova_t;
    e nome lo carichi con una strcpy() (o meglio ancora, strncpy()).
    Grazie per la risposta, comunque buffer è la stringa da cui prelevo i dati, il problema era dunque il fatto che l'assegnazione con strtok avviene localmente, cioè credo che strtok restituisca una stringa localmente e quindi non visibile dal chiamante, ho risolto assegnando p->nome con strdup, ma non capisco per quale motivo l'intero è visibile mentre la stringa no.

    Grazie


    Edit:
    Ho capito tutto, strtok non esegue nessuna allocazione, modifica semplicemente la stringa passata ovvero buffer, che essendo locale non viene vista dal programma chiamante, mentre strdup esegue un allocazione, e quindi il puntatore restiuito risulta corretto e visibile dal chiamante
  • Re: Problema struct con puntatore char

    Infatti, leggendo la documentazione

    http://www.cplusplus.com/reference/cstring/strtok

    ad un certo punto

    Parameters
    str
    C string to truncate.
    Notice that this string is modified ..
Devi accedere o registrarti per scrivere nel forum
3 risposte