Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Puntatori, stack, overflow.. la solita zuppa
Forum - C/C++ - Puntatori, stack, overflow.. la solita zuppa

Avatar
TheWorm (Member)
Rookie


Messaggi: 24
Iscritto: 13/09/2009

Segnala al moderatore
Postato alle 22:26
Sabato, 27/03/2010
Mi stavo chiedendo.. se ho un puntatore ad una variabile allocata sullo stack c'è un modo per sapere quanti byte ci posso scrivere al massimo prima di andare in overflow?
Grazie!

Ultima modifica effettuata da TheWorm il 27/03/2010 alle 22:27
PM Quote
Avatar
lorenzo (Normal User)
Guru


Messaggi: 1178
Iscritto: 15/04/2008

Segnala al moderatore
Postato alle 22:39
Sabato, 27/03/2010
basta calcolare la dimensione del dato puntato.

Esempio:

Codice sorgente - presumibilmente C/C++

  1. int *p;
  2. int lmaxp = sizeof(int);



Ultima modifica effettuata da lorenzo il 27/03/2010 alle 22:39
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6384
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 22:44
Sabato, 27/03/2010
La risposta corretta è no.

Un puntatore non ti dice nulla della zona puntata.

(non si deve ragionare guardando il sorgente ... pensiamo solamente ad un puntatore ottenuto dinamicamente ...)


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
lorenzo (Normal User)
Guru


Messaggi: 1178
Iscritto: 15/04/2008

Segnala al moderatore
Postato alle 13:15
Domenica, 28/03/2010
aspetta un attimo, utilizzando la sizeof posso ottenere la dimensione in byte del dato puntato dal puntatore.

Quindi sapendo la "grandezza" dello spazio di memoria riservato per quella variabile puntata dal puntatore, posso gestirla per non sforare.

Instanziando dinamicamente le cose non cambiano, dovrei usare la sizeof moltiplicandola per la dimensione....

es:

Codice sorgente - presumibilmente C/C++

  1. int *n = (int *)malloc(sizeof(int) * 4);



allora la dimensione massima della memoria puntata da n sarà sizeof(int) * 4

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6384
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 13:21
Domenica, 28/03/2010
Tutto quello che dici è valido se conosci il tipo di dato puntato e la dimensione ... a questo punto NON hai bisogno di partire dal puntatore perchè l'informazione già ce l'hai ...

Il problema è quando si parte dal puntatore SENZA sapere alcunchè di quello a cui il puntatore punta ... in questo caso, non puoi fare nulla ...

Per capirci, supponi di avere una funzione che accetta un puntatore a char

int func(char *p)

e tu devi determinare, all'interno della funzione, la dimensione dell'area puntata da p ...

Ovviamente, tutto quello che conosci, è p

Ultima modifica effettuata da nessuno il 28/03/2010 alle 13:23


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
lorenzo (Normal User)
Guru


Messaggi: 1178
Iscritto: 15/04/2008

Segnala al moderatore
Postato alle 15:32
Domenica, 28/03/2010
certo, in quel caso non si può sapere la dimensione della memoria.

PM Quote
Avatar
TheWorm (Member)
Rookie


Messaggi: 24
Iscritto: 13/09/2009

Segnala al moderatore
Postato alle 21:06
Domenica, 28/03/2010
Si, intendevo senza sapere cosa punta il puntatore. Comunque ho trovato la risposta qua: http://www.evilsocket.net/867/c-stack-inspection.html
Grazie, ciao

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6384
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 11:24
Martedì, 30/03/2010
Quel codice (discutibile perchè prevede dei presupposti non sempre veri) NON è valido per puntatori di aree allocate nell' heap (come quelli ottenuti dalla malloc) ...



Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
TheWorm (Member)
Rookie


Messaggi: 24
Iscritto: 13/09/2009

Segnala al moderatore
Postato alle 20:49
Martedì, 30/03/2010
Infatti ho parlato di stack. non heap ;)

PM Quote