Bonjour à tous.
Je suis actuellement étudiant et il nous a été demandé de réaliser un projet (en C) qui est de créer un démineur avec la librairie graphique Libsx.
Je travaille sur Ubuntu.
Pour ce faire, j'ai créé une structure ayant comme champ un pointeur sur pointeur d'int, que j'ai écrit de la façon suivante :
Cette variable me permettra de stocker puis placer, sur un plateau de jeu de taille L * C, un nombre de bombe (qui dépend de la difficulté par exemple) placé aléatoirement.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 typedef struct { int **bombe ;//Données partagées } Donnees;
Il faut donc que j'alloue dynamiquement de la mémoire à mon "tableau 2D". Voici comment j'ai procédé :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 //L et C sont des #define définis respectivement à 50 et 25 Donnees d; d.bombe = (int **) calloc(L, sizeof(int*)); for (i=0; i<L; i++) { *(d.bombe+i) = (int*) calloc(C, sizeof(int)); }
Jusqu'ici tout fonctionne bien, je peux même afficher mes bombes (grâce à différentes fonctions graphiques de ma librairie).
Je suis actuellement entrain de rédiger une fonction permettant de tester si une bombe est présente à GAUCHE, HAUT-GAUCHE, HAUT, HAUT-DROITE, DROITE, BAS-DROITE, BAS, BAS-GAUCHE (soit 8 tests au total) de la case cliqué.
Il faut donc surveiller à ce que les coordonnées citées ne dépassent pas du tableau (par exemple d.bombe[-1][2]) en cas quel cas, je devrais avoir un retour "segmentation fault" car je tente d'accéder à une case mémoire qui n'est normalement pas alloué à ma matrice.
=> Donc en effet, si je dépasse en -1 ou en L+1 (pour la 1ère dimension de ma matrice) j'ai effectivement un retour "segmentation fault" sur mon terminal (par exemple d.bombe[-1][2] ou par exemple d.bombe[51][2] font crash mon programme).
=> Maintenant, si je fais la même chose pour la 2nd dimension de ma matrice (donc que je dépasse en -1 ou en C+1), il se trouve que ça marche!! J'ai le droit à des indices négatifs et de monter assez haut dans les indices. J'ai donc essayé de voir jusqu'à quelle valeur je pouvais aller. Pour y=1264 (ou +) ou y=-32529 (ou -) le programme me fait un segmentation fault.
J'ai réalisé ces tests indépendamment des autres fonctions du programme afin de voir d'où pourrait venir "l'erreur", mais je ne comprends vraiment pas d'où cela pourrait venir. Je ne sais même pas si l'accès à ces cases mémoires est possible. Et si oui, pourquoi cela ne marcherait-il pas pour la 1ère dimension ?
Avez-vous une idée de ce qui pourrait provoquer ceci ?
Partager