Bonjour,
Je viens de commencer le développement d'un petit module en C gérant un carré de chiffres pour un jeu de sudoku. J'utilise donc une structure contenant les différents champs de l'objet, dont un pointeur sur le tableau qui contient les chiffres du carré. Je développe sous Linux avec gcc.
Lors de l'allocation de mémoire pour le tableau, le programme sort sur une erreur que je ne comprends pas. Voici la sortie du shell :
Je pense que ce n'est pas le comportement normal de malloc. J'ai mis un traitement d'erreur signalant si le pointeur contient NULL après allocation, il n'est même pas exécuté.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 *** glibc detected *** free(): invalid next size (fast): 0x0804a018 *** Abandon
Le plus étrange, c'est quand je ne laisse plus que 2 champs unsigned int (j'en ai 3), ça marche...
Voici les sources :
sudokuregion.c (mon module)
... et son header sudokuregion.h
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61 // sudokuregion.c // Gère une région de grille de sudoku // (carré de 9 cases gnéralement) #include <stdio.h> #include <stdlib.h> #include "sudokuregion.h" struct sudokuRegion { unsigned int *numarray; unsigned int width; unsigned int height; unsigned int len; }; /* Le constructeur */ sudokuRegion sudokuRegion_new() { // Allocation de la structure sudokuRegion sreg = malloc(sizeof(sudokuRegion)); if(sreg == NULL) { fprintf(stderr, "Erreur allocation structure!\n"); exit(EXIT_FAILURE); } // Remplissage des champs sreg->width = 3; sreg->height = 3; sreg->len = 9; // Allocation du tableau // (et ça plante ici) sreg->numarray = calloc(sreg->len, sizeof(int)); if(sreg->numarray == NULL) { fprintf(stderr, "Erreur allocation tableau!\n"); exit(EXIT_FAILURE); } return sreg; } /* Le libérateur */ void sudokuRegion_dispose(sudokuRegion sreg) { free(sreg); sreg = NULL; }
N'oublions pas le programme de test : sudoku.c
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 #ifndef SUDOKUREGION_H #define SUDOKUREGION_H typedef struct sudokuRegion * sudokuRegion; extern sudokuRegion sudokuRegion_new(); extern void sudokuRegion_dispose(sudokuRegion reg); #endif
...ainsi que le Makefile au cas où!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 #include <stdio.h> #include <stdlib.h> #include "sudokuregion.h" int main(int argc, char *argv[]) { sudokuRegion region = sudokuRegion_new(); sudokuRegion_dispose(region); return EXIT_SUCCESS; }
J'ai essayé plein de trucs, même le changement de l'ordre des champs dans le struct y est pour quelque chose!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 CC=gcc CFLAGS=-g -Wall -std=c99 LDFLAGS=-g -Wall -std=c99 EXEC=sudoku all: $(EXEC) sudoku: sudoku.o sudokuregion.o $(CC) -o $@ $^ $(LDFLAGS) %.o: %.c $(CC) -o $@ -c $< $(CFLAGS) clean: rm -rf *.o mrproper: clean rm -rf $(EXEC)
Quelles sont les erreurs que j'ai faites dans mon code? Que dois-je corriger pour que ça veuille bien marcher?
Merci d'avance.
Partager