2010-01-27 6 views
1

Frappant ma tête pendant 1 heure, ne peut pas trouver la réponse:matrice pointeur se déréférencé au milieu du code

int *get_possible_moves(int **board, int *w, int *h, int *x, int *y) { 
int movespossible=0; 
int moveslist[2][8]; 
//4 
if(x + 1 <= w-1 && y + 2 <= h - 1) { 
    if(board[*(int *)y + 2][*(int *)x + 1] == 0) { 
    moveslist[movespossible][0] = *(int *)x + 1; 
breakpoint-> moveslist[movespossible][1] = *(int *)y + 2; 
    movespossible++; 
    } 
} 

à une ligne marquée breakpoint-> mon ** bord se déréférencé. Des indices pourquoi il en est ainsi? Il n'y a pas de threads concurrents qui utilisent cet endroit en mémoire. De plus, je n'utilise pas ** board du tout sur cette ligne.

//3 
if(x + 2 <= w - 1 && y + 1 <= h - 1) { 
    if(board[*(int *)y + 1][*(int *)x + 2] == 0) { 
    moveslist[movespossible][0] = *(int *)x + 2; 
    moveslist[movespossible][1] = *(int *)y + 1; 
    movespossible++; 
    } 
} 

Ce code fonctionne parfaitement.

Merci d'avance!

+0

Pourquoi tous les moulages inutiles (int *)? –

Répondre

2

Vous avez:

int moveslist[2][8]; 

... mais vous faites référence souvent:

moveslist[movespossible][0] 
moveslist[movespossible][1] 

... ne devrait pas vous faire:

moveslist[0][movespossible] 
moveslist[1][movespossible] 

?

+0

+1 Et puis c'est probablement trashing la pile, où 'board' vit aussi ... –

+0

@ Martin, oui - un assert simple le trouverait immidement :) –

+0

Résolu! J'ai regardé mal la variable tout le temps! – jpou

0

OK, c'est compris. Array hors limites.

Cela se produit rapidement lorsque movespossible++ est effectué deux fois.

Lorsque le tableau est hors des limites, il continue à voyager dans l'espace mémoire aléatoire, en frappant finalement la carte.

Questions connexes