Torna indietro   Hardware Upgrade Forum > Software > Programmazione

ASUS NUC 15 Pro e NUC 15 Pro+, mini PC che fondono completezza e duttilità
ASUS NUC 15 Pro e NUC 15 Pro+, mini PC che fondono completezza e duttilità
NUC 15 Pro e NUC 15 Pro+ sono i due nuovi mini-PC di casa ASUS pensati per uffici e piccole medie imprese. Compatti, potenti e pieni di porte per la massima flessibilità, le due proposte rispondono in pieno alle esigenze attuali e future grazie a una CPU con grafica integrata, accompagnata da una NPU per la gestione di alcuni compiti AI in locale.
Cybersecurity: email, utenti e agenti IA, la nuova visione di Proofpoint
Cybersecurity: email, utenti e agenti IA, la nuova visione di Proofpoint
Dal palco di Proofpoint Protect 2025 emerge la strategia per estendere la protezione dagli utenti agli agenti IA con il lancio di Satori Agents, nuove soluzioni di governance dei dati e partnership rafforzate che ridisegnano il panorama della cybersecurity
Hisense A85N: il ritorno all’OLED è convincente e alla portata di tutti
Hisense A85N: il ritorno all’OLED è convincente e alla portata di tutti
Dopo alcuni anni di assenza dai cataloghi dei suoi televisori, Hisense riporta sul mercato una proposta OLED che punta tutto sul rapporto qualità prezzo. Hisense 55A85N è un televisore completo e versatile che riesce a convincere anche senza raggiungere le vette di televisori di altra fascia (e altro prezzo)
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: 3769
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: 3769
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: 3769
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: 3769
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: 3769
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: 3769
l'estetica nei prg conta fino a mezzogiorno conta che funzionino
bancodeipugni è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


ASUS NUC 15 Pro e NUC 15 Pro+, mini PC che fondono completezza e duttilità ASUS NUC 15 Pro e NUC 15 Pro+, mini PC che fondo...
Cybersecurity: email, utenti e agenti IA, la nuova visione di Proofpoint Cybersecurity: email, utenti e agenti IA, la nuo...
Hisense A85N: il ritorno all’OLED è convincente e alla portata di tutti Hisense A85N: il ritorno all’OLED è convi...
Acer TravelMate P6 14 AI: il Copilot+ PC sotto il chilo per il professionista in movimento Acer TravelMate P6 14 AI: il Copilot+ PC sotto i...
Recensione Borderlands 4, tra divertimento e problemi tecnici Recensione Borderlands 4, tra divertimento e pro...
Imgur blocca gli utenti del Regno Unito:...
ROG Xbox Ally già in consegna: qu...
Ubisoft annuncia Vantage Studios: Assass...
Il solare diventa la prima fonte di elet...
Google Home si rinnova completamente: ar...
Dense Geometry Format (DGF): novit&agrav...
Gemini for Home arriva a ottobre sui dis...
Amazon Smart Air Quality Monitor: a soli...
Mazzata Raspberry Pi, i prezzi aumentano...
Amazon Seconda Mano - Warehouse: extra s...
Una giornata smart tra lago e montagna: ...
Google lancia le nuove Nest Cam con vide...
Sembra Temu ma non è: Amazon sfid...
Svizzera, tassazione dei veicoli elettri...
Una stampante a getto di inchiostro 'lib...
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: 16:25.


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