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 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
*** glibc detected *** free(): invalid next size (fast): 0x0804a018 ***
Abandon
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é.

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)
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;
 
}
... et son header sudokuregion.h
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
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
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;
}
...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
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)
J'ai essayé plein de trucs, même le changement de l'ordre des champs dans le struct y est pour quelque chose!

Quelles sont les erreurs que j'ai faites dans mon code? Que dois-je corriger pour que ça veuille bien marcher?

Merci d'avance.