Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    delucidazione casting C

    Che cosa significa questo codice?
    codice:
     
    int a = 5;
    int *b = (int *) &a;

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    quando è così leggi pian piano l'istruzione.

    Parti da &a: questa istruzione serve a chiedere l'indirizzo della variabile "a" che tu hai definito di tipo intero nella precedente istruzione.

    Poi hai le parentesi, quindi vuol dire che tu questo indirizzo vuoi considerarlo come un puntatore ad intero (int *) ovviamente lo assegni ad una variabile del corretto valore ( int * b)

    se esegui questo pezzo di codice così

    codice:
        int a = 5;
        int *b = (int *) &a;
        printf("valore di a %d \n" , *b);
    a video vedi valore di a 5

  3. #3
    Per inciso, quel cast non serve a niente, dato che sia il tipo dell'espressione di partenza (&a) che quello della variabile da inizializzare (b) è comunque int *.
    Originariamente inviato da valia
    ovviamente lo assegni ad una variabile del corretto valore ( int * b)
    "Del corretto tipo", semmai; tipo e valore sono due cose ben distinte.
    Amaro C++, il gusto pieno dell'undefined behavior.

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    Originariamente inviato da MItaly
    Per inciso, quel cast non serve a niente, dato che sia il tipo dell'espressione di partenza (&a) che quello della variabile da inizializzare (b) è comunque int *.
    infatti è un rafforzativo inutile,

    Originariamente inviato da MItaly
    "Del corretto tipo", semmai; tipo e valore sono due cose ben distinte.
    volevo dire tipo, piccolo lapsus scusate

  5. #5
    Originariamente inviato da valia
    infatti è un rafforzativo inutile,
    Ti dirò di più, a mio avviso (se usato in del codice "vero") è anche pericoloso, visto che, se venisse cambiato il tipo di a ma ci si dimenticasse di cambiare il tipo di b, l'errore passerebbe inosservato.
    volevo dire tipo, piccolo lapsus scusate
    Nulla di male, capita, puntualizzavo solo per evitare che sys14 facesse confusione.
    Amaro C++, il gusto pieno dell'undefined behavior.

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    Originariamente inviato da MItaly
    Ti dirò di più, a mio avviso (se usato in del codice "vero") è anche pericoloso, visto che, se venisse cambiato il tipo di a ma ci si dimenticasse di cambiare il tipo di b, l'errore passerebbe inosservato.
    penso sia solo un esempio d'uso del casting (lo spero), anche se devo dire nei libri di testo che ho usato una roba del genere non l'ho mai vista :|

  7. #7
    ok, chiarito questo, arriviamo ad un altro punto:
    codice:
    struct sockaddr_in info; /* struttura sockaddr_in implementata per poter configurare la connessione (porta, protocollo)*/
    struct hostent *h; /* struttura hostnet implementata per poter configurare l'ip o host*/
    
    info.sin_family = AF_INET; /* protocollo */
    info.sin_port = htons(6669); /* porta */
    h = gethostbyname("no-host"); /* host */
    memcpy((char *)&info.sin_addr, (char *)h->h_addr_list[0], 4); /* che significa questa riga? */

  8. #8
    Premetto che, come prima, anche qui tutti i cast sono inutili, dato che tutte le espressioni a cui sono applicati sono già del tipo giusto (memcpy accetta dei void * come primi argomenti, a cui può decadere qualunque puntatore senza cast). Dunque la possiamo riscrivere come:
    codice:
    memcpy(&info.sin_addr, h->h_addr_list[0], 4);
    Andiamo con ordine; la memcpy è una funzione che copia nella destinazione specificata dal primo argomento il numero di byte specificati nell'ultimo argomento. La zona da cui i byte da copiare sono presi è specificata come secondo argomento.

    info è un sockaddr_in, che rappresenta un endpoint del socket; il suo membro sin_addr rappresenta l'indirizzo IP, ed è una union che di fatto espone in tre maniere diverse (come 4 byte, come 2 valori da 16 bit o come un singolo valore a 32 bit) gli stessi 4 byte di memoria. In ogni caso, &info.sin_addr equivale a prendere l'indirizzo di memoria a cui viene memorizzato l'indirizzo. Tale locazione di memoria viene usata come destinazione della copia.

    h rappresenta un host; h_addr_list è un array di char * che contiene i vari indirizzi associati all'host in questione. h->h_addr_list[0] si riferisce dunque al primo degli indirizzi associati all'host. Di fatto nella memoria puntata da h->h_addr_list[0] si trovano semplicemente 4 byte che rappresentano l'indirizzo (assumendo di star parlando di IPv4). Tali 4 byte dunque sono quelli che vengono copiati da memcpy.

    Per farla breve: la riga in questione copia l'indirizzo dell'host rappresentato da h nel campo dell'indirizzo della variabile info.
    Amaro C++, il gusto pieno dell'undefined behavior.

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 © 2025 vBulletin Solutions, Inc. All rights reserved.