Indice del forum Olimpo Informatico
I Forum di Zeus News
Leggi la newsletter gratuita - Attiva il Menu compatto
 
 FAQFAQ   CercaCerca   Lista utentiLista utenti   GruppiGruppi   RegistratiRegistrati 
 ProfiloProfilo   Messaggi privatiMessaggi privati   Log inLog in 

    Newsletter RSS Facebook Twitter Contatti Ricerca
* [C] Problema con i puntatori di puntatori
Nuovo argomento   Rispondi    Indice del forum -> Programmazione
Precedente :: Successivo  
Autore Messaggio
Smjert
Dio maturo
Dio maturo


Registrato: 01/04/06 18:19
Messaggi: 1619
Residenza: Perso nella rete

MessaggioInviato: 03 Nov 2008 01:25    Oggetto: * [C] Problema con i puntatori di puntatori Rispondi citando

Mettiamo che io abbia questo:

Codice:
char *buffer = malloc(10*sizeof(char));
char *ptr = buffer;
char ** ptrtoptr = ptr;


Per essere precisi sto riproducendo cosa dovrebbe fare il mio codice visto che alcuni puntatori sono passati via funzione, buffer è globale, ptr sta in una funzione e il suo address viene mandato come parametro ad un'altra funzione che tra i parametri definisce ptrtoptr.

Diciamo che più realisticamente sono in questa situazione:

file1.c
Codice:
char *buffer = malloc(10*sizeof(char)); <- è una variabile globale


file2.c
Codice:
char *ptr = buffer;
func(&ptr);

file3.c
Codice:
void func(char **ptrtoptr)
{
  *ptrtoptr++;
}

Ma non è la stessa cosa che fa il codice sopra?

Il problema è, se io faccio *ptrtoptr++ per accedere al prossimo elemento di buffer questo mi esce dalla zona concessa e mi dà SigSev (tra l'altro sto programmando su Linux).
Quello che non capisco è perchè esce dalla zona.. non è come se facessi ptr++?
Top
Profilo Invia messaggio privato HomePage
arkypita
Eroe
Eroe


Registrato: 13/08/08 17:04
Messaggi: 67

MessaggioInviato: 03 Nov 2008 16:42    Oggetto: Rispondi citando

Occhio alla precedenza degli operatori: l'operatore di incremento ha la precedenza rispetto all' operatore di puntatore, quindi devi scrivere:

(*ptrtoptr)++;

se vuoi prendi il valore contenuto nel puntatore ptrtoptr e incrementalo di uno

altrimenti, quello che hai scritto tu

*ptrtoptr++;

vuole dire incrementa di uno il puntatore ptrtoptr e prendi il valore che trovi.

C'è una bella differenza
Top
Profilo Invia messaggio privato
arkypita
Eroe
Eroe


Registrato: 13/08/08 17:04
Messaggi: 67

MessaggioInviato: 03 Nov 2008 16:49    Oggetto: Rispondi citando

Per completezza di informazioni, guarda la tabella in fondo a questa pagina: http://digilander.libero.it/uzappi/C/C-precedenze.html
Top
Profilo Invia messaggio privato
SverX
Supervisor Macchinisti
Supervisor Macchinisti


Registrato: 25/03/02 12:16
Messaggi: 11806
Residenza: Tokelau

MessaggioInviato: 03 Nov 2008 18:32    Oggetto: Rispondi citando

arkypita ha scritto:
altrimenti, quello che hai scritto tu
*ptrtoptr++;
vuole dire incrementa di uno il puntatore ptrtoptr e prendi il valore che trovi.


penso proprio volesse incrementare il puntatore, per prendere il valore nel carattere successivo...

comunque, per rispondere alla domanda iniziale, incrementando un puntatore ad un char _dovresti_ andare avanti di un carattere, mentre incrementando un puntatore ad un puntatore di un char, non vai al carattere successivo, ma andrai ad un puntatore successivo. E questo probabilmente non esiste e quindi punterai 'a caso', ecco perchè dell'errore...
Top
Profilo Invia messaggio privato HomePage
Smjert
Dio maturo
Dio maturo


Registrato: 01/04/06 18:19
Messaggi: 1619
Residenza: Perso nella rete

MessaggioInviato: 03 Nov 2008 18:59    Oggetto: Rispondi

O poffarbacco lo sapevo che era una cavolata Very Happy

@sverx: cmq era proprio un problema di priorità, adesso usando le parentesi prima mi "prende" il puntatore e poi con l'incremento passa al prossimo carattere che punta Wink

Grazie Wink.
Top
Profilo Invia messaggio privato HomePage
Mostra prima i messaggi di:   
Nuovo argomento   Rispondi    Indice del forum -> Programmazione Tutti i fusi orari sono GMT + 2 ore
Pagina 1 di 1

 
Vai a:  
Non puoi inserire nuovi argomenti
Non puoi rispondere a nessun argomento
Non puoi modificare i tuoi messaggi
Non puoi cancellare i tuoi messaggi
Non puoi votare nei sondaggi