Vai al contenuto

Primario: Sky Slate Blackcurrant Watermelon Strawberry Orange Banana Apple Emerald Chocolate Marble
Secondario: Sky Slate Blackcurrant Watermelon Strawberry Orange Banana Apple Emerald Chocolate Marble
Sfondo: Blank Waves Squares Notes Sharp Wood Rockface Leather Honey Vertical Triangles
Corsi di Laurea










ROX @ Unisa - Forum degli studenti di Ingegneria utilizza i cookie. Se prosegui la navigazione accetti il loro uso.    Accetto l'uso dei cookie
-->
Foto

Java buono e C cattivo... Un problema di puntatori!


  • Effettua l'accesso per rispondere
Questa discussione ha avuto 4 risposta/e

#1
Enrico

Enrico

    Advanced Member

  • Utente
  • StellaStellaStella
  • 305 Messaggi:
Ho bisogno di un commento e di un esempio per questa proposizione:

"Il fatto che il passaggio avvenga sempre per valore [in java] garantisce che un oggetto possa
essere modificato e, contemporaneamente, si è certi che dopo la chiamata del metodo il
reference punti sempre allo stesso oggetto.
In altri linguaggi, come il C, è permesso anche il passaggio di parametri “per
riferimento”. In quel caso al metodo viene passato l'intero riferimento, non solo il suo
indirizzo, con la conseguente possibilità di poterne mutare l'indirizzamento.
Questa
caratteristica non è stata importata in Java, perché considerata (a ragione) una minaccia
alla sicurezza. Molti virus, worm etc… sfruttano infatti la tecnica del passaggio per
riferimento.
"

Ho dubbi in particolare sulla frase evidenziata in grassetto. Inoltre ho la seguente domanda:
in java quando viene passato un "reference" (puntatore) viene passato "già referenziato"?

Caffè pagato a quanti vorranno risondermi! Oltre a mille grazie cadauno ;)


"All men are equal, but some are more equal than others."
George Orwell, Animal farm

#2
|system88|

|system88|

    Moderatore globale

  • Moderatore
  • 4133 Messaggi:
Allora, partiamo con una piccola premessa: PER QUEL CHE NE SO IO! :D

Detto questo, possiamo cominciare la discussione dicendo che, intanto, anche in C il passaggio dei parametri è solo per riferimento; il passaggio per valore è un camuffamento xkè, in realtà, viene passato il valore per riferimento.. In definitiva, Java e C utilizzano la stessa tecnica per il passaggio dei parametri con l'unica differenza che in C l'operazione deve essere esplicitata attraverso gli operatori di indirezione.

A questo punto veniamo alla parte evidenziata

In quel caso al metodo viene passato l'intero riferimento, non solo il suo
indirizzo, con la conseguente possibilità di poterne mutare l'indirizzamento.


Cosa rappresenta il riferimento se non l'indirizzo dell'area di memoria in cui è contenuto il valore da passare? Del resto non riuscirei ad immaginare cosa altro possa rappresentare questo riferimento.. In conclusione, a mio modesto avviso, non noto differenze "teoriche" tra il passaggio in C ed in Java (se non quelle elencate precedentemente)..

Una cosa è evidente: in C aumentano i rischi di esporre un programma a BOF (Buffer Over Flow) con l'uso poco consapevole del linguaggio stesso, ma ciò è dovuto, per l'appunto, alla caratteristica intrinseca del C che permette un "doppio" tipo di indirizzamento... Del resto il problema può ampiamente essere bypassato con opportuni accorgimenti.

L'argomento virus, worm e via discorrendo non dipende esclusivamente dal programma (sia esso scritto in C o in Java), ma un considerevole ruolo lo svolge il sistema operativo e qui non entro nel merito della questione perchè ci sarebbe da scrivere una vagonata di roba, e forse anke di più!

Per quanto riguarda il riferimento in java, beh, se ho capito bene la tua domanda, all'atto della dichiarazione associ a quell'elemento un'indirizzo in memoria quindi, la risposta alla tua domana è si, ogni elemento, una volta dichiarato, viaggia sempre parallelamente al suo riferimento in memoria, MA, e c'è un ma grande quanto una casa, fin tanto che l'elemento non viene istanziato quell'area di memoria non contiene il valore dell'elemento cui è legata!

P.s. Adesso la faccio io a te una domanda: dove l'hai presa quella frase?
Esistono solo due modi per scrivere un programma senza errori.
Ma e' solo il terzo modo quello che funziona realmente.

#3
ZeroLuka

ZeroLuka

    Advanced Member

  • Utente
  • StellaStellaStella
  • 266 Messaggi:
Dico anche io quel che so a riguardo...
Le 2 parole chiavi sono SEMANTICA DEI VALORI e SEMANTICA DEI RIFERIMENTI.
Il C è nella semantica dei valori, JAVA nella semantica dei riferimenti; da questo ne discende che, per quanto riguarda il C, ciò che si usa manipolando le variabili di qualsiasi tipo è il loro valore destro (eccezion fatta per l'espressione di assegnamento), che in questa semantica rappresenta il VALORE. Per quanto riguarda JAVA, invece, il valore destro di ogni variabile (se di variabili si può parlare visto l'uso di classi ed oggetti) è già il suo RIFERIMENTO o INDIRIZZO (il tutto dovrebbe valere anche per i tipi primitivi).
Questo che ho detto non si contraddice affatto con ciò che dice la citazione fatta da Enrico (che somiglia a qualcosa che ai tempi dell'esame di O.O.P. lessi sul Thinking in Java), in particolare con i primi 3 righi: infatti è detto che in java il passaggio è fatto per valore, più propriamente ciò che accade è che si passa per valore il riferimento, cioè il valore destro è un riferimento e non più un puro valore a causa della semantica in cui ci si ritrova.
In definitiva per i problemi di sicurezza che riporta la citazione, ma anche per problemi legati alla "difficoltà" di manipolare i puntatori col C, nel linguaggio Java, che attualmente domina nella programmazione in rete (ecco il perchè del miglioramento sotto l'aspetto della sicurezza rispetto al C), si è scelto di cambiare registro rendendo, per dirla più rozzamente ed intenderci meglio, "ogni cosa un puntatore".
:ahsisi: Percannella DOCET!
" Come tu nn conosci la via del vento, né come si formino le ossa in seno alla donna incinta, così nn conosci l'opera di Dio, che fa tutto."
(Ecclesiaste 11:5) ...from Holy Bible!
Immagine inviata

#4
Enrico

Enrico

    Advanced Member

  • Utente
  • StellaStellaStella
  • 305 Messaggi:
Intanto grazie a entrambi per le risposte.

possiamo cominciare la discussione dicendo che, intanto, anche in C il passaggio dei parametri è solo per riferimento; il passaggio per valore è un camuffamento xkè, in realtà, viene passato il valore per riferimento..

forse il contrario!

dove l'hai presa quella frase?

l'ho letta su un libro che si chiama "OO && JAVA 5" di Claudio Desio. Lo si trova gratis in internet.

Cmq, rileggendo bene la frase mi sembra di aver capito che mentre in C "nel passaggio del riferimento per valore" è possibile modificare anche il valore destro per accedere ad aree di memeoria diverse, in Java non è possibile modificare direttamente il right value del riferimento.
"All men are equal, but some are more equal than others."
George Orwell, Animal farm

#5
|system88|

|system88|

    Moderatore globale

  • Moderatore
  • 4133 Messaggi:

Cmq, rileggendo bene la frase mi sembra di aver capito che mentre in C "nel passaggio del riferimento per valore" è possibile modificare anche il valore destro per accedere ad aree di memeoria diverse, in Java non è possibile modificare direttamente il right value del riferimento.

Esattamente!
Esistono solo due modi per scrivere un programma senza errori.
Ma e' solo il terzo modo quello che funziona realmente.




Leggono questa discussione 1 utenti

0 utenti, 1 ospiti, 0 utenti anonimi