PDA

Visualizza la versione completa : [C] Errore con aritmetica dei puntatori


ilmo lesto
05-09-2007, 10:52
mi spiegate dove sbaglio con il ragionamento? posto questo codice creato al momento per semplificare la lettura.

sta di fatto che non riesco a far scorrere il puntatore per legggere le singole lettere della stringa... credo che l'errore sia talmente stupido che non riesco nemmeno a vederlo...



#include <stdio.h>
#define SIZE 10

void myFunc (char **sPtr, char *word);

int main(){

char string[SIZE], word[SIZE];
char *sPtr;

fgets (string, SIZE, stdin);

sPtr = string;

myFunc(&sPtr, word);

printf("\n%s\n", word);

return 0;

}

void myFunc (char **sPtr, char *word){

int cont = 0;

printf("\nstringa puntata da sPtr: %s\n", *sPtr);
printf("*sPtr[%d] punta alla lettera %c\n",cont, *sPtr[cont]);

while (cont < SIZE){

word[cont] = *sPtr[cont++];
printf("\nword[%d]: %c\n", cont - 1, word[cont - 1]);

/*INCREMENTANDO cont QUESTA ISTRUZIONE PORTA AD UN BUS ERROR*/
printf("\nora *sPtr[%d] punta alla lettera %c\n",cont, *sPtr[cont]);

}

return;
}


il doppio puntatore nella funzione è necessario al mio programma (anche se qui in realtà non lo è...)

andbin
05-09-2007, 11:55
Originariamente inviato da ilmo lesto

printf("*sPtr[%d] punta alla lettera %c\n",cont, *sPtr[cont]);C'è solo un piccolo dettaglio che non hai considerato: l'operatore [] (accesso ad un array) ha una priorità maggiore rispetto all'operatore * (dereferenziazione). Pertanto il modo corretto è:

(*sPtr)[cont]

ilmo lesto
05-09-2007, 13:09
grazie mille andbin!!

ma mi spieghi allora perchè nella funzione myFunc, la prima printf, dove cerco di visualizzare il carattere puntato da sPtr, viene interpretata correttamente, mentre quando incremento cont non viene più letta correttamente? non dovrebbe darmi errore anche nella prima printf?

la printf di cui parlo ovviamente è



printf("*sPtr[%d] punta alla lettera %c\n",cont, *sPtr[cont]);

andbin
05-09-2007, 13:33
Originariamente inviato da ilmo lesto
ma mi spieghi allora perchè nella funzione myFunc, la prima printf, dove cerco di visualizzare il carattere puntato da sPtr, viene interpretata correttamente, mentre quando incremento cont non viene più letta correttamente? non dovrebbe darmi errore anche nella prima printf?Su array e puntatori esiste una regola "aurea": una espressione a[i] viene convertita (dal compilatore) nella equivalente *(a+i)

Pertanto la tua espressione

*sPtr[cont]

viene convertita in:

*( *(sPtr+cont) )

Se cont = 0 (come all'inizio nella printf), l'espressione diventa:

**sPtr, che, come caso particolare, è corretta e permette di accedere al primo carattere della stringa.

Ma come ho detto *sPtr[cont] non è quello che ti serve, perché tratterebbe sPtr come un array di puntatori, andando a prendere il puntatore all'indice 'cont' per poi dereferenziarlo.
Però tu non passi alla funzione un puntatore a un array di puntatori a char, bensì passi un puntatore a un singolo puntatore a char.

ilmo lesto
05-09-2007, 14:55
grazie ancora,
sei stato chiarissimo ed ora ho capito perfettemante!

:ciauz:

Loading