2010-09-17 6 views
0

J'ai cette méthode simple pour déplacer un élément dans un tableau.Ce morceau de code C/Obj-C me dérange

void queuePut(uint32_t val, uint32_t *q, int qlen) { 
    for (int i=qlen; i>0; i--) { 
     q[i] = q[i-1]; 
    } 
    q[0] = val; 
} 

Dans mon en-tête de classe i défini un struct

@interface MyClass : NSObject { 
    struct { 
     uint32_t cookie[10]; 
     uint32_t value[10]; 
    } queue; 
} 

Je mets à plusieurs reprises des éléments devant les deux files d'attente

queuePut((uint32_t)cookie, myClassInstance->queue.cookie, cookieQueueLen); 
queuePut((uint32_t)intValue, myClassInstance->queue.value, valueQueueLen); 

Quand je fais ma valeur mise en page de file d'attente est la suivante sur heure:

0.0.0.0.0.0.0.0.0.0. 
0.0.0.0.0.0.0.0.0.0. 
0.0.0.0.0.0.0.0.0.0. 
1.0.0.0.0.0.0.0.0.0. 
1.0.0.0.0.0.0.0.0.0. 
0.0.0.0.0.0.0.0.0.0. 
0.0.0.0.0.0.0.0.0.0. 
0.0.0.0.0.0.0.0.0.0. 
0.0.0.0.0.0.0.0.0.0. 
0.0.0.0.0.0.0.0.0.0. 

Quand je supprime la première ligne queuePut((uint32_t)cookie, ... la file d'attente de valeur indique ce (ce que je veux que ce soit):

0.0.0.0.0.0.0.0.0.0. 
0.0.0.0.0.0.0.0.0.0. 
0.0.0.0.0.0.0.0.0.0. 
1.0.0.0.0.0.0.0.0.0. 
1.1.0.0.0.0.0.0.0.0. 
0.1.1.0.0.0.0.0.0.0. 
0.0.1.1.0.0.0.0.0.0. 
0.0.0.1.1.0.0.0.0.0. 
0.0.0.0.1.1.0.0.0.0. 
0.0.0.0.0.1.1.0.0.0. 

Quelles sont les causes de cette?

Cordialement, Erik

Répondre

4

Exactement ce que sont cookieQueueLen et valueQueueLen?

Ce suspect est:

void queuePut(uint32_t val, uint32_t *q, int qlen) { 
    for (int i=qlen; i>0; i--) { 
     q[i] = q[i-1]; 
    } 
    q[0] = val; 
} 

Si vous passez 10 pour qlen, puis sur la première itération vous écrivez à q[10], qui est au-delà des limites des tableaux cookie (ou value). Tu es en train d'écraser la mémoire. Dans ce cas, vous écrivez au-delà de la fin du tableau cookie et au début du tableau value.

+1

oh mon dieu je ne peux pas croire à quel point je suis stupide. J'étais assis heures et je ne vois pas! mais parfois vous avez juste besoin d'une autre personne pour vous montrer l'évidence;) –

Questions connexes