Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine porta Logan in un'avventura inedita, violenta e fortemente narrativa, costruita attorno alla sua natura di combattente e al difficile rapporto con il proprio passato. Insomniac Games punta su combattimenti spettacolari, progressione e personalizzazione, inserendo l'azione in un mondo segnato dalla persecuzione dei mutanti. Un viaggio intenso, che alterna mattanza, esplorazione e momenti sorprendentemente emotivi.
DJI Romo 2: tante novità lo rendono un robot completo
DJI Romo 2: tante novità lo rendono un robot completo
Romo 2 è la seconda generazione di robot lavapavimenti di DJI, un modello che si caratterizza per la precisione nel sistema di navigazione e per il funzionamento particolarmente silenzioso. Con le modifiche introdotte in questa seconda versione, e un posizionamento di prezzo più allineato alla concorrenza, rappresenta una valida alternativa sul mercato delle soluzioni di pulizia domestica
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Il primo Sony con retroilluminazione True RGB alla prova del banco di misura e dei contenuti: luminanza enorme, colori accurati in HDR e un antiriflesso molto efficace. I limiti sono due sole HDMI 2.1 e il blooming fuori asse
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 20-01-2014, 11:40   #1
sharkkk
Member
 
L'Avatar di sharkkk
 
Iscritto dal: Oct 2013
Messaggi: 158
[C] Puntatori e pila

Supponendo di avere un programma che fa solo

Codice:
int main()
{

    int var = 0;
    int *p;

    p = &a;

    ...non importante

}
nella pila come viene gestito il tutto?

cioè:

1 - int var = 0; var viene messo nella pila, ma viene inserito anche il suo valore nello stack oppure va in un altro segmento?
2- int var = 0; per allocare un intero in memoria usiamo 4 byte, pero c'e anche il nome della variabile (var) che sono 3 caratteri piu il terminatore, quindi sulla pila avremmo 4 byte del nome della variabile piu 4 byte del contenuto della variabile?
3- int *p; quando dichiaro un puntatore, nello stack che valore gli viene assegnato di default? viene creato un indirizzo dinamico dall'heap che viene assegnato al puntatore?
4- p = &a; a questo punto nella pila cosa succede? a p assegniamo l'indirizzo della variabile a, ma come fa a prenderla, chi deteneva l'indirizzo della variabile?

sicuramente ho fatto 1000! errori ma sto cercando di imparare come lavora la pila

p.s. questo prototipo di funzione void *f(); è uguale a void f(); o sono due cose diverse?

Ultima modifica di sharkkk : 20-01-2014 alle 11:55.
sharkkk è offline   Rispondi citando il messaggio o parte di esso
Old 20-01-2014, 13:25   #2
Daniels118
Senior Member
 
L'Avatar di Daniels118
 
Iscritto dal: Jan 2014
Messaggi: 852
Ciao,
1 - nello stack viene inserito solo il valore di var, in questo caso 4 byte tutti a zero;
2 - i nomi delle variabili figurano solo nel sorgente, una volta compilato il programma non vengono più presi in considerazione, pertanto non occupano spazio in memoria;
3 - quando dichiari un puntatore senza inizializzarlo, viene solo decrementato lo stack pointer, senza scrivere alcun valore (vale anche per variabili non inizializzate), pertanto assume il valore che si trovava in quell'area dello stack (praticamente spazzatura);
4 - gli indirizzi delle variabili li decide il compilatore (a meno di eventuali offset per la rilocazione del programma in memoria) e restano invariati per tutta la fase di compilazione.

Se dichiari una funzione void vuol dire che quella funzione non restituisce alcun valore. se la dichiari come void* vuol dire che restituisce un puntatore a void, ovvero un puntatore ad un tipo di dato non determinato; tipicamente si utilizza quando la stessa funzione può restituire un puntatore a dati di diverso tipo; sta al chiamante determinare che tipo di dato viene restituito in base alle specifiche della funzione.
Daniels118 è offline   Rispondi citando il messaggio o parte di esso
Old 20-01-2014, 13:45   #3
sharkkk
Member
 
L'Avatar di sharkkk
 
Iscritto dal: Oct 2013
Messaggi: 158
grazie mille daniele.

volevo chiederti due cose che non ho ancora ben chiare:

1) so che la funzione void f(){..} restituisce un void, tu dici che void *f() restituisce un puntatore a void..quindi è uguale a scrivere *void f()?

2)se i nomi delle variabili non vengono considerati piu una volta compilato il programma, se il programma implica una modifica di una variabile, ad esempio un incremento (x++) come fa a sapere il valore che aveva prima quella variabile se non ne conosco il nome?
sharkkk è offline   Rispondi citando il messaggio o parte di esso
Old 20-01-2014, 14:25   #4
Daniels118
Senior Member
 
L'Avatar di Daniels118
 
Iscritto dal: Jan 2014
Messaggi: 852
1) Personalmente non ricordo di aver mai visto l'asterisco scritto prima del tipo di dato, credo che *void generi un errore di sintassi.

2) (come ho scritto prima) una volta che il compilatore ha assegnato un indirizzo ad una variabile, tale indirizzo rimane invariato durante tutta la fase di compilazione e (aggiungo) resta legato alla variabile a cui è assegnato; pertanto, ogni volta che il compilatore incontra la variabile x - qualunque operazione tu voglia fare con essa - utilizzerà l'indirizzo assegnato al momento della dichiarazione.
Daniels118 è offline   Rispondi citando il messaggio o parte di esso
Old 20-01-2014, 15:04   #5
sharkkk
Member
 
L'Avatar di sharkkk
 
Iscritto dal: Oct 2013
Messaggi: 158
Quote:
Originariamente inviato da Daniels118 Guarda i messaggi
1) Personalmente non ricordo di aver mai visto l'asterisco scritto prima del tipo di dato, credo che *void generi un errore di sintassi.

2) (come ho scritto prima) una volta che il compilatore ha assegnato un indirizzo ad una variabile, tale indirizzo rimane invariato durante tutta la fase di compilazione e (aggiungo) resta legato alla variabile a cui è assegnato; pertanto, ogni volta che il compilatore incontra la variabile x - qualunque operazione tu voglia fare con essa - utilizzerà l'indirizzo assegnato al momento della dichiarazione.
grazie mille daniele, alla fine è tutto piu semplice di quello che sembra.

la dichiarazione del prototipo void *f(); mi aveva spiazzato perche avevo letto che le funzioni erano dei puntatori e vedere * prima della funzione pensavo fosse un puntatore a puntatore, invece come mi hai spiegato è cioè che viene restituito, un puntatore a void.

grazie mille ancora
sharkkk è offline   Rispondi citando il messaggio o parte di esso
Old 20-01-2014, 18:04   #6
vendettaaaaa
Senior Member
 
L'Avatar di vendettaaaaa
 
Iscritto dal: Jan 2012
Messaggi: 1267
Quote:
Originariamente inviato da sharkkk Guarda i messaggi
grazie mille daniele, alla fine è tutto piu semplice di quello che sembra.

la dichiarazione del prototipo void *f(); mi aveva spiazzato perche avevo letto che le funzioni erano dei puntatori e vedere * prima della funzione pensavo fosse un puntatore a puntatore, invece come mi hai spiegato è cioè che viene restituito, un puntatore a void.

grazie mille ancora
Infatti l'asterisco dovrebbe stare attaccato al tipo, anzichè alla variabile (o alla funzione), perchè va a modificare il tipo. Invece i C-isti lo attaccano alle variabili...bah!
Cmq non si dice "restituisce un void", perchè void non è un tipo. Indica la mancanza di un valore di ritorno.
void* invece significa un puntatore a qualsiasi tipo. Una funzione che accetta un parametro void* può prendere in ingresso un puntatore qualsiasi. Poi lo casta a quel che le serve e lo usa, ed è un passaggio obbligato visto che non puoi dereferenziare una variabile void:
void* a = f();
*a = 3; // errore
*((int*)a) = 3; // ok (sintatticamente, per lo meno)
vendettaaaaa è offline   Rispondi citando il messaggio o parte di esso
Old 20-01-2014, 19:30   #7
Oceans11
Senior Member
 
L'Avatar di Oceans11
 
Iscritto dal: Sep 2005
Città: Torino
Messaggi: 606
Quote:
Originariamente inviato da vendettaaaaa Guarda i messaggi
Infatti l'asterisco dovrebbe stare attaccato al tipo, anzichè alla variabile (o alla funzione), perchè va a modificare il tipo. Invece i C-isti lo attaccano alle variabili...bah!
Personalmente l'asterisco lo attacco (come i C-isti) alla variabile perchè dichiarazioni del tipo:

Codice:
int *x, y;
scritta così mi rende chiaro subito che x è puntatore e y no. Al contrario:
Codice:
int* x, y;
così sembrano entrambi variabili di tipo int* (ossia puntatori a int)
__________________
"Se proprio dovete piratare un prodotto, preferiamo che sia il nostro piuttosto che quello di qualcun altro." [Jeff Raikes]
"Pirating software? Choose Microsoft!"
Oceans11 è offline   Rispondi citando il messaggio o parte di esso
Old 20-01-2014, 22:10   #8
vendettaaaaa
Senior Member
 
L'Avatar di vendettaaaaa
 
Iscritto dal: Jan 2012
Messaggi: 1267
Quote:
Originariamente inviato da Oceans11 Guarda i messaggi
Personalmente l'asterisco lo attacco (come i C-isti) alla variabile perchè dichiarazioni del tipo:

Codice:
int *x, y;
scritta così mi rende chiaro subito che x è puntatore e y no. Al contrario:
Codice:
int* x, y;
così sembrano entrambi variabili di tipo int* (ossia puntatori a int)
Perchè ti capita spesso? Io metto una variabile per riga cmq, più chiaro per me.
vendettaaaaa è offline   Rispondi citando il messaggio o parte di esso
Old 20-01-2014, 23:01   #9
Oceans11
Senior Member
 
L'Avatar di Oceans11
 
Iscritto dal: Sep 2005
Città: Torino
Messaggi: 606
Quote:
Originariamente inviato da vendettaaaaa Guarda i messaggi
Perchè ti capita spesso? Io metto una variabile per riga cmq, più chiaro per me.
No in realtà non lo faccio capitare, metto anche io una variabile per riga.
Volevo dire che ho fatto mio quello stile di format quando ho approcciato al c e quello mi è rimasto.
Devo dire che però non così infrequentemente incontro codice (di altre persone) che usa l'altro tipo.
__________________
"Se proprio dovete piratare un prodotto, preferiamo che sia il nostro piuttosto che quello di qualcun altro." [Jeff Raikes]
"Pirating software? Choose Microsoft!"
Oceans11 è offline   Rispondi citando il messaggio o parte di esso
Old 21-01-2014, 07:44   #10
Daniels118
Senior Member
 
L'Avatar di Daniels118
 
Iscritto dal: Jan 2014
Messaggi: 852
Sintatticamente è corretto in entrambi i modi, io personalmente ricordo di aver variato il mio stile, gli ultimi programmi che ho scritto in c avevano l'asterisco attaccato alla variabile. In ogni caso ho sempre adottato il metodo di scrivere una variabile per riga, lo trovo molto più chiaro.
Daniels118 è offline   Rispondi citando il messaggio o parte di esso
Old 21-01-2014, 19:56   #11
bancodeipugni
Senior Member
 
L'Avatar di bancodeipugni
 
Iscritto dal: Nov 2013
Città: Nel cuore dell'8 Mile di Detroit
Messaggi: 3984
Quote:
Originariamente inviato da Daniels118 Guarda i messaggi
Sintatticamente è corretto in entrambi i modi, io personalmente ricordo di aver variato il mio stile, gli ultimi programmi che ho scritto in c avevano l'asterisco attaccato alla variabile. In ogni caso ho sempre adottato il metodo di scrivere una variabile per riga, lo trovo molto più chiaro.
ma anche più lungo
tu scrivi:
int a;
int b;
int *c;
char *T;
float m;
....
....
bancodeipugni è offline   Rispondi citando il messaggio o parte di esso
Old 21-01-2014, 20:07   #12
Daniels118
Senior Member
 
L'Avatar di Daniels118
 
Iscritto dal: Jan 2014
Messaggi: 852
La gente fa sempre a gara per quello e tu ti preoccupi di risparmiare

A parte gli scherzi, nomi di variabili a, b, c possono andare bene a scuola, in un progetto serio si utilizzano quasi sempre nomi mnemonici di discreta lunghezza (chi non lo fa dovrebbe cominciare), basta metterne 3 sulla stessa riga per andare oltre il margine. Avendo scritto di recente programmi su terminale 3270 ho trovato molto sconveniente superare i 72 caratteri per riga, la navigazione diventa un inferno, poi, de gustibus...
Daniels118 è offline   Rispondi citando il messaggio o parte di esso
Old 22-01-2014, 10:13   #13
bancodeipugni
Senior Member
 
L'Avatar di bancodeipugni
 
Iscritto dal: Nov 2013
Città: Nel cuore dell'8 Mile di Detroit
Messaggi: 3984
si puo' andare a capo con la virgola per evitare di ripetere int
su programmi complessi converrebbe proprio creare l'.h solo per le variabili, uno solo per le costanti ecc
bancodeipugni è offline   Rispondi citando il messaggio o parte di esso
Old 22-01-2014, 19:48   #14
bancodeipugni
Senior Member
 
L'Avatar di bancodeipugni
 
Iscritto dal: Nov 2013
Città: Nel cuore dell'8 Mile di Detroit
Messaggi: 3984
le metti dentro la funzione, ovviamente
bancodeipugni è offline   Rispondi citando il messaggio o parte di esso
Old 23-01-2014, 08:08   #15
Daniels118
Senior Member
 
L'Avatar di Daniels118
 
Iscritto dal: Jan 2014
Messaggi: 852
Credo che intendesse dire "mettere l'include nella funzione". A me personalmente non piace quest'approccio ma, come ho detto prima, è questione di gusti.
Daniels118 è offline   Rispondi citando il messaggio o parte di esso
Old 23-01-2014, 10:49   #16
bancodeipugni
Senior Member
 
L'Avatar di bancodeipugni
 
Iscritto dal: Nov 2013
Città: Nel cuore dell'8 Mile di Detroit
Messaggi: 3984
dipende quanto vasto è il programma

potrebbe far comodo anche la realizzazione di librerie condivise ecc per unificare il codice
bancodeipugni è offline   Rispondi citando il messaggio o parte di esso
Old 23-01-2014, 18:15   #17
vendettaaaaa
Senior Member
 
L'Avatar di vendettaaaaa
 
Iscritto dal: Jan 2012
Messaggi: 1267
Quote:
Originariamente inviato da bancodeipugni Guarda i messaggi
dipende quanto vasto è il programma

potrebbe far comodo anche la realizzazione di librerie condivise ecc per unificare il codice
Che trovata geniale!!!
vendettaaaaa è offline   Rispondi citando il messaggio o parte di esso
Old 23-01-2014, 20:27   #18
bancodeipugni
Senior Member
 
L'Avatar di bancodeipugni
 
Iscritto dal: Nov 2013
Città: Nel cuore dell'8 Mile di Detroit
Messaggi: 3984
prova in c:\windows\system32

è pieno
bancodeipugni è offline   Rispondi citando il messaggio o parte di esso
Old 24-01-2014, 11:25   #19
bancodeipugni
Senior Member
 
L'Avatar di bancodeipugni
 
Iscritto dal: Nov 2013
Città: Nel cuore dell'8 Mile di Detroit
Messaggi: 3984
l'estetica nei prg conta fino a mezzogiorno conta che funzionino
bancodeipugni è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa Marvel's Wolverine, la recensione: Logan torna p...
DJI Romo 2: tante novità lo rendono un robot completo DJI Romo 2: tante novità lo rendono un ro...
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED Sony Bravia 9 II: il True RGB alla prova, dove l...
Geely EX5, un mese al volante: il SUV elettrico cinese che ci ha sorpreso (quasi) senza riserve Geely EX5, un mese al volante: il SUV elettrico ...
Mova Z70 Ultra Roller Complete: motore potente, rullo di lavaggio e l'IA a guidare Mova Z70 Ultra Roller Complete: motore potente, ...
La Serie A con DAZN e Amazon Prime con l...
Giochi Ubisoft su Steam senza Ubisoft Co...
Miami Beach ha autorizzato la maxi opera...
Apple regala un altro anno di funzioni s...
Alla fine è successo davvero: Vol...
Il meglio di Amazon del weekend in uno s...
Speciale TV in offerta su Amazon: Hisens...
Non c'è pace per Trezor: 347.000 e-mail ...
È un portatile Dell e li vale tut...
Apple iPhone 17 Pro Max 256GB a 1.195€ (...
GPT-6 Astra è davvero AGI o non s...
LG OLED G6S 48'' a 845€ e G6 55'' a 1368...
Mantax Otax: il malware Android che crip...
Musk incassa un altro maxi contratto IA:...
Le vendite di EV sono esplose in tutto i...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 21:58.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v