Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it L'avatar di felpone
    Registrato dal
    Jun 2010
    Messaggi
    182

    [c]

    Salve a tutti.

    Ho un problema:

    codice:
    void f(int *p1, int p2);
    
    int main(void){
        
    f(0,i-r);
    return 0;
    }
    
    //qui c'è la definizione di f omessa da me per velocizzare
    ho compilato in c99 e non mi da errori,ma io sto passando ad f un intero mentre vuole un puntatore come primo parametro come è possibile che non dia errore?

  2. #2
    Stai passando in realtà un puntatore nullo.
    int *j = 0;
    oppure
    int *j = NULL;

  3. #3
    Utente di HTML.it L'avatar di felpone
    Registrato dal
    Jun 2010
    Messaggi
    182
    e se gli avessi passato un int=2 ??

  4. #4
    Utente di HTML.it L'avatar di torn24
    Registrato dal
    Aug 2008
    Messaggi
    551

    ciao

    un puntatore , contiene un indirizzo di memoria !

    l'indirizzo di memoria è un numero , quindi tu stai facendo puntare il puntatore all'indirizzo
    0 , tutto lecito , anche se inutile visto che non sai cosa contiene quell'indirizzo
    Tecnologia

  5. #5
    Il C non si fa grossi problemi a lasciarti convertire implicitamente un puntatore in un intero (e viceversa), anche se qualunque compilatore recente/decente ti segnalerà un warning. Nota che invece il C++ è molto più "stretto" in questi cast impliciti, e genererebbe un errore (anche se comunque si può aggirare usando un reinterpret_cast o un cast stile C).
    Amaro C++, il gusto pieno dell'undefined behavior.

  6. #6
    Utente di HTML.it L'avatar di felpone
    Registrato dal
    Jun 2010
    Messaggi
    182
    ok, tutto chiaro fin quì.
    e se io cercassi di utilizzare quel puntatore di cui non conosco il reale contenuto dell'indirizzo di memoria così:


    codice:
    int b[3]={p1[4]};
    Secondo me anche quì non c'è errore di compilazione ma potrebbe portare a undefined bahavior a tempo di esecuzione oppure no?

  7. #7
    È undefined behavior, dato che stai dereferenziando un puntatore che non punta (con sicurezza) ad alcunché di valido. Nota comunque che, impostando in maniera corretta i warning, è praticamente impossibile non accorgersi di un errore del genere al momento della compilazione.
    Amaro C++, il gusto pieno dell'undefined behavior.

  8. #8
    Utente di HTML.it L'avatar di felpone
    Registrato dal
    Jun 2010
    Messaggi
    182
    è undefined behavior anche questo caso?

    codice:
    static int j;
    
    t+=r[i+j];
    dovrebbe essere undefined perchè la var j non è inizializzata giusto?

  9. #9
    No; le variabili che hanno static storage duration (di fatto le variabili static e le variabili globali [C99 §6.2.4 ¶3]) sono inizializzate automaticamente a zero [C99, §6.7.8 ¶10].
    Amaro C++, il gusto pieno dell'undefined behavior.

  10. #10
    Utente di HTML.it L'avatar di felpone
    Registrato dal
    Jun 2010
    Messaggi
    182
    Perfetto,grazie.
    Pongo l'ultimo caso di sospetto undefined behavior

    codice:
    for(u=6,t=a[--u];u;u--){};
    Non dovrebbe esserci un UB a causa di questo pezzo
    codice:
    for(u=6,t=a[--u];...
    in quanto la var u è sia inizializzata che decrementata e non sappiamo qual'è l'operazione eseguita prima?

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.