Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2003
    Messaggi
    726

    [C] Una domanda su un puntatore a void

    Ho sempre saputo che quando uso la funzione malloc(n) mi viene restituito un puntatore a void relativo al primo byte della locazione appena riservata.

    Ma cosa vuol dire che è un puntatore a void??

    Se facessi cosi:
    codice:
    lista /* puntatore ad una struct lista */ l = malloc(sizeof(struct lista));
    anzichè cosi:

    codice:
    lista l = (lista) malloc(sizeof(struct lista));
    Grazie

  2. #2

    Re: [C] Una domanda su un puntatore a void

    Originariamente inviato da Downloader
    Ho sempre saputo che quando uso la funzione malloc(n) mi viene restituito un puntatore a void relativo al primo byte della locazione appena riservata.

    Ma cosa vuol dire che è un puntatore a void??

    Se facessi cosi:
    codice:
    lista /* puntatore ad una struct lista */ l = malloc(sizeof(struct lista));
    anzichè cosi:

    codice:
    lista l = (lista) malloc(sizeof(struct lista));
    Grazie
    Il compilatore ti dovrebbe segnalare che stai assegnando un puntatore generico ad un puntatore specifico, salvandoti da possibili errori che per poter essere risolti potrebbero richiedere innumerevoli ore di "debug scientifico"

    p.s. definizione di "debug scientifico": quando ti trovi a trascrivere su un foglio il valore numerico dei puntatori.

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2003
    Messaggi
    726
    Ma sostanzialmente che differenza c'è tra un puntatore a void e un puntatore a un certo tipo??

    In fondo l'indirizzo sempre quello è.

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Originariamente inviato da Downloader
    Ma sostanzialmente che differenza c'è tra un puntatore a void e un puntatore a un certo tipo??

    In fondo l'indirizzo sempre quello è.
    Certo... ma forse non conosci l'aritmetica dei puntatori: cosa succede se hai un puntatore a int che punta ad un array di double e cerchi di incrementarlo? Un int occupa 4 byte, mentre un double ne occupa 8... un incremento sul puntatore ti porta a metà del primo double e non sul double successivo.
    codice:
    +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
    | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
    +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
      ^
      +-- Puntatore ad intero su array di double
    Dopo l'incremento di "Puntatore"
    codice:
    +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
    | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
    +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
                      ^
                      +-- Puntatore
    Un incremento di un puntatore a double (come dovrebbe essere) ti avrebbe portato al secondo byte marcato come "0", mentre ora ti trovi solo a metà del primo double... questo perchè il compilatore sa che "Puntatore" è un puntatore ad intero e non a double, quindi lo porta avanti di soli 4 byte anzichè di 8.

    Ora prova a immaginare cosa succede quando al posto di puntatori a semplici tipi primitivi, hai puntatori a strutture complesse...


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    Originariamente inviato da Downloader
    Ma sostanzialmente che differenza c'è tra un puntatore a void e un puntatore a un certo tipo??

    In fondo l'indirizzo sempre quello è.
    prova il seguente:

    Codice PHP:
    #include <stdio.h>

    int main (){
        
    void aGenericPtr 0;
        
    char aCharPtr = (char *) aGenericPtr;
        
    double aDoublePtr = (double *) aGenericPtr;
        
        
    printf ("%p;\n", (void *)(aCharPtr 1));
        
    printf ("%p;\n", (void *)(aDoublePtr 1));
        return 
    0;


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.