Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    59

    [C] dubbio sulle struct

    Ciao a tutti!!!

    Stavo rivedendo un po' le struct, e ho notato qualcosa di strano, mi spiego con un esempio

    Primo codice

    codice:
    #include <stdio.h>
     
    typedef struct prova{
        char str[20];
        int num;
    }PRO;
     
    void scrivi(PRO *s);
    void stampa(PRO s);
     
    int main()
    {
        PRO s;
     
        scrivi(&s);
        stampa(s);
     
        return 0;
     
    }
     
    void scrivi(PRO *s)
    {
        printf("\nInserire una stringa: ");
        scanf("%s", s->str);
        printf("\nInserire un numero: ");
        scanf("%d", &s->num);
    }
     
    void stampa(PRO s)
    {
        printf("\n\nStr: %s", s.str);
        printf("\nnum: %d", s.num);
    }
    Secondo codice

    codice:
    #include <stdio.h>
     
    typedef struct prova{
        char str[20];
        int num;
    }PRO;
     
    void scrivi(PRO *s);
    void stampa(PRO s);
     
    int main()
    {
        PRO s;
     
        scrivi(&s);
        stampa(s);
     
        return 0;
     
    }
     
    void scrivi(PRO *s)
    {
        printf("\nInserire una stringa: ");
        scanf("%s", &s->str);
        printf("\nInserire un numero: ");
        scanf("%d", &s->num);
    }
     
    void stampa(PRO s)
    {
        printf("\n\nStr: %s", s.str);
        printf("\nNum: %d", s.num);
    }
    Come avete potuto notare tra i due codici c'è una differenza ovvero
    nel primo uso
    scanf("%s", s->str);
    mentre nel secondo
    scanf("%s", &s->str);

    Tuttavia anche con questa differenza i due codici funzionano allo stesso modo, perché?
    Per me dovrebbe funzionare solo nel primo caso infatti il campo str della struttura è un vettore di caratteri quindi &str[0]==str.
    Cosa non sto considerando? qualcuno potrebbe spiegarmi perché nel secondo caso non succede nulla di strano?


    Ringrazio tutti anticipatamente!

  2. #2

    Re: [C] dubbio sulle struct

    Originariamente inviato da premoli
    codice:
        scanf("%d", s->str);
    codice:
        scanf("%s", &s->str);
    s è un puntatore.
    nel primo codice hai un puntatore s di cui recuperi l'indirizzo di str.
    nel secondo codice componi una reference del puntatore (chè alla fine è il puntatore stesso) e quindi è come se eseguissi il primo codice.

    s è come se fosse una variabile normale, facendo &s recuperi l'indirizzo dell'area puntata dal puntatore.

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    59
    Grazie mille per la risposta immediata, quindi sostanzialmente è la stessa cosa?


    Visto che ci sono approfitto della tua disponibilità e ti chiedo se invece s fosse un vettore quindi ad esempio:

    codice:
    #include <stdio.h>
    
    typedef struct prova{
        char str[20];
        int num;
    }PRO;
    
    void scrivi(PRO *s);
    void stampa(PRO *s);
    
    int main()
    {
        PRO s[2];
    
        scrivi(s);
        stampa(s);
    
        return 0;
    
    }
    
    void scrivi(PRO *s)
    {
        int i;
    
        for(i=0; i<2; i++){
            printf("\nInserire una stringa: ");
            scanf("%s", s[i].str);
            printf("\nInserire un numero: ");
            scanf("%d", &s[i].num);
        }
    }
    
    void stampa(PRO *s)
    {
        int i;
    
        for(i=0; i<2; i++){
            printf("\n\nStr: %s", s[i].str);
            printf("\nnum: %d", s[i].num);
            printf("\n");
        }
    }
    anche in questo caso fare scanf("%s", s[i].str); o scanf("%s", &s[i].str); è la stessa cosa?

  4. #4
    si anche perchè un array è un puntatore.

  5. #5
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    59
    LOL giusto!!!

    Grazie mille.

  6. #6
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Considera però che, quando nella scanf() specifichi il codice di formato %s, il secondo argomento deve essere un puntatore a char (char *). Detto questo, se passare il semplice nome della stringa o lo stesso nome preceduto da & è, ai fini del risultato, la stessa cosa (perché il valore è lo stesso), non lo è per quanto riguarda la compilazione: l'indirizzo di una stringa di fatto è di tipo char **, cioè puntatore a puntatore a carattere, quindi la compilazione potrebbe segnalarti un warning (se effettuata magari con opzioni più restrittive). In conclusione, poiché è preferibile evitare di prendere cattive abitudini, quando passi una stringa ad una scanf() evita di anteporre la &, senza contare poi che l'ideale sarebbe anche specificare l'ampiezza del buffer nel codice di formato stesso per evitare buffer overflow (o magari evitare del tutto una scanf() per la lettura delle stringhe e ricorrere ad una fgets()).
    every day above ground is a good one

  7. #7
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    59
    Infatti io per quello non riuscivo a capire, ragionavo come hai detto tu, ovvero che l'indirizzo di una stringa è un char ** quindi non riuscivo a capire come potesse funzionare, tra l'altro io per le stringhe uso già la fgets proprio per evitare problemi di buffer overflow.
    La mia era solo una curiosità, infatti non credevo proprio di riuscire a compilare, invece neanche un warning tutto normale.

  8. #8
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    A seconda del compilatore che usi dovrebbe essere possibile in qualche modo specificare un maggiore livello di warning in compilazione; in quel caso, una segnalazione dovrebbe risultare.
    every day above ground is a good one

  9. #9
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    59
    Ti ringrazio!!!

    Fatto, ecco il warning
    warning: format '%s' expects type 'char *', but argument 2 has type 'char (*)[20]'|

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.