Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - ambiguità sulle strutture
Forum - C/C++ - ambiguità sulle strutture

Avatar
Premoli (Normal User)
Pro


Messaggi: 108
Iscritto: 25/06/2009

Segnala al moderatore
Postato alle 18:48
Venerdì, 21/01/2011
Ciao a tutti!!!
Stavo rivedendo un po' le strutture e mi sono accorto di un'ambiguità, mi spiego con un banale esempio:

Primo codice

Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2.  
  3. typedef struct prova{
  4.     char str[20];
  5.     int num;
  6. }PRO;
  7.  
  8. void scrivi(PRO *s);
  9. void stampa(PRO s);
  10.  
  11. int main()
  12. {
  13.     PRO s;
  14.  
  15.     scrivi(&s);
  16.     stampa(s);
  17.  
  18.     return 0;
  19.  
  20. }
  21.  
  22. void scrivi(PRO *s)
  23. {
  24.     printf("\nInserire una stringa: ");
  25.     scanf("%s", s->str);
  26.     printf("\nInserire un numero: ");
  27.     scanf("%d", &s->num);
  28. }
  29.  
  30. void stampa(PRO s)
  31. {
  32.     printf("\n\nStr: %s", s.str);
  33.     printf("\nnum: %d", s.num);
  34. }



Secondo codice
Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2.  
  3. typedef struct prova{
  4.     char str[20];
  5.     int num;
  6. }PRO;
  7.  
  8. void scrivi(PRO *s);
  9. void stampa(PRO s);
  10.  
  11. int main()
  12. {
  13.     PRO s;
  14.  
  15.     scrivi(&s);
  16.     stampa(s);
  17.  
  18.     return 0;
  19.  
  20. }
  21.  
  22. void scrivi(PRO *s)
  23. {
  24.     printf("\nInserire una stringa: ");
  25.     scanf("%s", &s->str);
  26.     printf("\nInserire un numero: ");
  27.     scanf("%d", &s->num);
  28. }
  29.  
  30. void stampa(PRO s)
  31. {
  32.     printf("\n\nStr: %s", s.str);
  33.     printf("\nNum: %d", s.num);
  34. }




Come potete notare nel primo codice quando arrivo alla scanf non metto & contrariamente al secondo codice dove la metto

scanf("%s", s->str);
scanf("%s", &s->str);

qualcuno mi può spiegare perché in entrambi i casi il codice funziona non generando nessun errore?
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? 8-|

Ringrazio tutti anticipatamente

Ultima modifica effettuata da Premoli il 21/01/2011 alle 19:17
PM Quote
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1787
Iscritto: 26/06/2009

Segnala al moderatore
Postato alle 0:52
Sabato, 22/01/2011
La tua è un'osservazione molto acuta.

Secondo lo standard ANSI C, il valore di un array coincide con l'indirizzo del suo primo elemento.

Quindi se ho

char prova[30];

posso assolutamente asserire che

prova == &prova[0]

Il che spiega il tuo dubbio.

Puoi facilmente verificare che, dal momento che le struct sono una forma "generale" di array, l'indirizzo di una struct coincide con l'indirizzo del primo elemento della struct, cioè:

struct prova
{
int a;
int b;
} ciao;

accade che:
&ciao == &ciao.a

Se tutto ciò non ti è ancora chiaro, ti basta leggere lo standard ANSI C, che è molto chiaro nel definire questo genere di dettagli :-)
Ciao!


Software Failure: Guru Meditation
Forum su Informatica, Elettronica, Robotica e Tecnologia: http://www.nonsoloamiga.com
PM Quote
Avatar
Premoli (Normal User)
Pro


Messaggi: 108
Iscritto: 25/06/2009

Segnala al moderatore
Postato alle 9:49
Sabato, 22/01/2011
Mh, credo di aver capito quello che dici, quindi, in buona sostanza, si possono usare entrambe le forme senza distinzione?

perché ad esempio si ha che, se definisco una struttura di questo tipo

Codice sorgente - presumibilmente C++

  1. typedef struct prova{
  2.     char str[20];
  3.     char str1[20];
  4.     int num;
  5. }PRO;



s.str==&s.str
s.str1==&s.str1

giusto? :-?

PS: se puoi mi dai un link allo standard ANSI C

PM Quote
Avatar
crash outside control (Normal User)
Expert


Messaggi: 217
Iscritto: 12/02/2008

Segnala al moderatore
Postato alle 16:02
Sabato, 22/01/2011
Codice sorgente - presumibilmente C++

  1. typedef struct prova{
  2.           char str[20];
  3.           char str1[20];
  4.           int num;
  5.       }PRO;



&s==&s.str[0]
s.str==&s.str[0]
s.str1==&s.str1[0]

Ultima modifica effettuata da crash outside control il 22/01/2011 alle 16:21


Anche un orologio fermo segna l'ora giusta due volte al giorno.
Hermann Hesse
PM Quote
Avatar
Premoli (Normal User)
Pro


Messaggi: 108
Iscritto: 25/06/2009

Segnala al moderatore
Postato alle 16:18
Sabato, 22/01/2011
Ma allora nel mio primo esempio qual è la forma corretta?

PM Quote
Avatar
crash outside control (Normal User)
Expert


Messaggi: 217
Iscritto: 12/02/2008

Segnala al moderatore
Postato alle 16:41
Sabato, 22/01/2011
Vanno bene entrambi ... Io personalmente preferisco il primo modo.


Anche un orologio fermo segna l'ora giusta due volte al giorno.
Hermann Hesse
PM Quote