2011-08-18 2 views
10

So che è stato eseguito un hash per un certo numero di volte, ma oggi mi sono imbattuto in un caso che ha sciolto la mia comprensione dell'indice matematico/indice del puntatore.Indice matematico puntatore vs. matrice

Come ho sempre capito, & mybuff [10] e (& mybuff + 10) sono modi equivalenti di referenziamento della stessa memoria.

Comunque ho passato la mattina a combattere un caso in cui:

memcpy(&mybuff+10,&in,8); 

overflow del buffer, quando viene compilato con l'ottimizzazione on e ha lavorato bene quando compilato per il debug.

Mentre athe stesso tempo,

memcpy(&mybuff[10],&in,8); 

lavorato bene in entrambi i casi.

Mille grazie per qualsiasi idea o suggerimento.

+10

tee hee al gioco di parole per chiedere "puntatori" – Daniel

+9

[Alcuni puntatori] (http://xkcd.com/138/). – mopsled

+1

'& mybuff [10]' restituisce 'e (* (mybuff + 10))', che è diverso da '& mybuff + 10'. Ricorda che gli operatori postfissi come '[]' hanno una precedenza più alta rispetto agli operatori unari come '&'. –

risposta

1

La sintassi corretta è non mybuff+10&mybuff+10 che dice spostarsi posiziona 10 nell'array e copia 8 byte (per te r dichiarazione memcpy). Non è ancora noto se si possano effettivamente contenere altri 8 byte.

+0

Sytax corretto per cosa ??? – user12861

+0

@ user12861: Vai qui - http://www.learncpp.com/cpp-tutorial/68-pointers-arrays-and-pointer-arithmetic/ –

+0

Sto dicendo che questa risposta non è chiara. Personalmente, conosco almeno questo C++. – user12861

2

Penso che tu abbia qualche problema con il puntatore.
Se mybuff è un puntatore, quindi mybuff + 10 == &(mybuff[10]).
Non è lo stesso di &mybuff + 10 come se ci fosse.

6

mi invento una dichiarazione di mybuff per il bene di questo esempio:

char mybuff[123]; 

Ora, &mybuff+10 fa puntatore arithmic su &mybuff, che ha il tipo "puntatore a schiera di 123 caratteri". Questo è diverso dal semplice mybuff che (dopo il decadimento del puntatore) ha tipo "puntatore al carattere". Il valore di bit di queste due espressioni è lo stesso, ma poiché sono indicatori di cose di dimensioni diverse, si comportano diversamente con l'aritmetica del puntatore.

&mybuff+10 significa che si desidera superare dieci degli array di 123 caratteri del tipo (il che è privo di significato data la dichiarazione e potrebbe essere segfault), mentre mybuff+10 dice solo che si desidera eseguire il controllo di dieci singoli caratteri.

2

(&mybuff+10) e &mybuff[10] sono non equivalente, ma &mybuff[10] e mybuff + 10 sono.

+0

Non del tutto; '& mybuff [10]' analizza come '& (mybuff [10])', che viene valutato come '& (* (mybuff + 10))'. –

+0

Che è equivalente a 'mybuff + 10'. –

+0

è sufficiente rimuovere o modificare la prima riga della nostra risposta, perché non è chiaro per i principianti. – xitx

4

&mybuff[10] è equivalente a &mybuff[0] + 10 che equivale a mybuff + 10

Array indicizzazione è definita in termini di puntatori. p[i] significa *(p+i) (Sto ignorando la necessità di parentesi aggiuntive nel caso p o i è un'espressione più complessa), dove p è un valore puntatore e i è un valore intero.

Curiosità: Poiché l'aggiunta, anche il puntatore + l'aggiunta di un numero intero, è commutativa, p[i] può anche essere scritto come i[p]. Sì, 4["Hello"] == 'o'. Per il bene di chiunque legga il tuo codice in futuro, ti preghiamo di fare non fare uso di questa conoscenza.

Un riferimento eccellente sulla relazione tra gli array e il puntatore in C (e C++, in cui le regole sono quasi identiche) è la sezione 6 dello comp.lang.c FAQ. (Avrei potuto collegarmi direttamente alla sezione 6, ma mi piace incoraggiare le persone a sfogliarlo, l'intera cosa vale la pena leggere.)