Allocation de pointeur sur tableau dans un struct : erreur incompréhensible
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:
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:
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:
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:
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:
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.