Precedente :: Successivo |
Autore |
Messaggio |
Smjert Dio maturo


Registrato: 01/04/06 18:19 Messaggi: 1619 Residenza: Perso nella rete
|
Inviato: 03 Nov 2008 01:25 Oggetto: * [C] Problema con i puntatori di puntatori |
|
|
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 |
|
 |
arkypita Eroe

Registrato: 13/08/08 17:04 Messaggi: 67
|
Inviato: 03 Nov 2008 16:42 Oggetto: |
|
|
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 |
|
 |
arkypita Eroe

Registrato: 13/08/08 17:04 Messaggi: 67
|
Inviato: 03 Nov 2008 16:49 Oggetto: |
|
|
Per completezza di informazioni, guarda la tabella in fondo a questa pagina: http://digilander.libero.it/uzappi/C/C-precedenze.html |
|
Top |
|
 |
SverX Supervisor Macchinisti


Registrato: 25/03/02 12:16 Messaggi: 11806 Residenza: Tokelau
|
Inviato: 03 Nov 2008 18:32 Oggetto: |
|
|
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 |
|
 |
Smjert Dio maturo


Registrato: 01/04/06 18:19 Messaggi: 1619 Residenza: Perso nella rete
|
Inviato: 03 Nov 2008 18:59 Oggetto: |
|
|
O poffarbacco lo sapevo che era una cavolata
@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
Grazie . |
|
Top |
|
 |
|