Ho un pezzo di codice in cui sto cercando di restituire il quadrato del valore indicato da *ptr
.Cosa c'è di sbagliato con questo codice C
int square(volatile int *ptr)
{
int a,b;
a = *ptr;
b = *ptr;
return a * b;
}
main()
{
int a=8,t;
t=square(&a);
printf("%d",t);
}
relativo funzionamento benissimo per me, ma autore di questo codice ha detto che potrebbe non funzionare a causa della seguente motivo:
Perché è possibile che il valore di *ptr
per cambiare in modo imprevisto, è possibile che a e b di essere diverso. Di conseguenza, questo codice potrebbe restituire un numero che non è un quadrato !. Il modo corretto di fare è
long square(volatile int *ptr)
{
int a;
a = *ptr;
return a * a;
}
Volevo davvero sapere perché ha detto così?
Se '* ptr' cambia tra l'assegnazione a a l'assegnazione a b, il risultato non è un quadrato. Non ho idea di cosa causerà '* ptr' per cambiare. – Sjoerd
L'unica cosa che posso pensare in un ambiente multi-thread il contenuto di * ptr potrebbe cambiare in un altro thread. In questo caso, potrebbe avere un valore diverso da b. – Totonga
La tua seconda versione ha una firma fuorviante; 'a * a' è un' int', e la conversione implicita a 'long' arriva troppo tardi per aumentare la precisione del valore di ritorno. Per risolvere il problema, dovresti dichiarare 'a' come' long'. (Naturalmente, su molti sistemi 'long' e' int' sono comunque sinonimi.) – ruakh