[C] Problème d'erreur de segmentation

Fermé
o00gourou00o Messages postés 7 Date d'inscription mercredi 26 avril 2006 Statut Membre Dernière intervention 15 décembre 2010 - 19 déc. 2006 à 16:12
Mahmah Messages postés 496 Date d'inscription lundi 17 septembre 2007 Statut Membre Dernière intervention 22 juin 2010 - 18 mars 2008 à 20:44
B'jour les gens!
Voilà voilà, je programme un p'tit peu en C et je suis face à une erreur de segmentation qui refuse de se casser... J'ai jeté un oeil aux autres messages sur le sujet mais j'ai pas trouvé mon bonheur et ça marche toujours pas!
Le but est de lire un fichier dans lequel se trouve sous forme de texte un niveau pour un labyrinthe et de le mettre dans un tableau pour pouvoir l'utiliser...

Voici mon code:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <unistd.h>
#include <fcntl.h>

#define max 128
#define taille 128


//Voilà une fonction qui prend en paramètre un fichier et un tableau de chaînes de caractères et qui copie toutes les lignes du fichier dans le tableau.

char **FichierDansTableau (char *fichier, char *tableau[])
{
	char buf[1], tmp[1024];
	int a=0;
	int b=0;
	int i, j, file1;

	//On alloue de la memoire pour le tableau, assez pour 128 lignes et 128 colonnes, pour l'instant.
	tableau = (char **)malloc(sizeof(char)*taille); 
	for (i=0; i<taille; i++)
	{
		tableau[i]=(char *)malloc(sizeof(char)*max);
	}

	strcpy(tmp, "");

	//On ouvre le fichier qui contient les informations
	if ((file1=open(fichier, O_RDONLY))<0)
	{
		printf("Erreur lors de l'ouverture du fichier %s\n",fichier);
		exit(0);
	}

	//Et voila la boucle qui sert a placer le texte dans le tableau: tant que le fichier n'a pas atteint sa fin (EOF), si le caractere lu n'est pas un saut de ligne, on le recopie a la suite de la ligne temporaire.
	//Si le caractere est un saut de ligne, on verifie si on a pas atteint le maximum de lignes du tableau (a savoir 128). Si c'est le cas on realloue de la memoire pour 128 autres lignes de 128 caracteres.
	//Une fois qu'on est assure d'avoir de la memoire, on recopie la ligne temporaire dans le tableau, on la vide et on retourne a la premiere colonne.
	//Une fois sorti de la boucle, on met NULL a la fin du tableau. 	
	while (read(file1, buf, 1)>0)
	{
		if (buf[0]!='\n')
		{
			tmp[b]=buf[0];
			b++;
		}
		else
		{
			strncpy(tableau[a], tmp, b);
			strcpy(tmp,"");
			b=0;
			a++;
		}
	}
	tableau[a]=NULL;
	close(file1);
	return tableau;
}




int main(void)
{
	char **tableau;
	int i, j;
	
	//On place le contenu de "lvl1.txt" dans un tableau de chaînes de caractères
	tableau = FichierDansTableau ("lvl1.txt", tableau);
	
	//Et on affiche le tableau histoire de tester...
	for (i=0; i<128; i++)
	{
		for (j=0; j<128; j++)
		{
			printf("%c", tableau[i][j]);
		 }
	 }
	
	return 0;
}


Si vous pouviez me filer un petit coup de main ce serait sympa ^^ (y'a rien à faire les mallocs ont toujours été une source d'embrouilles pour moi)
Merci d'avance pour vos réponses!
A voir également:

3 réponses

mype Messages postés 2435 Date d'inscription jeudi 1 novembre 2007 Statut Membre Dernière intervention 16 août 2010 436
18 mars 2008 à 20:26
vous arrivez 1 an et demi trop tard...
1
Mahmah Messages postés 496 Date d'inscription lundi 17 septembre 2007 Statut Membre Dernière intervention 22 juin 2010 125
18 mars 2008 à 20:44
Humph, m'a suis encore fait eu !

:-(

Merci !
M.
0
fai voir a ton close(file);
0
Mahmah Messages postés 496 Date d'inscription lundi 17 septembre 2007 Statut Membre Dernière intervention 22 juin 2010 125
18 mars 2008 à 20:23
Salutations,

Seg Fault c'est la délicate manière qu'a linux pour te prévenir que tu as déconné avec sa mémoire.

Je n'ai pas pu tester vraiment ton programme puisqu'il n'est pas en C standard et moi sous Windows. : /


Ceci dit, l'initialisation est boiteuse.

tableau = (char **) malloc( sizeof( char ) * taille );

Le cast semble vouloir dire que le malloc est une zone mémoire destinée à contenir des char *. Le sizeof n'a pas l'air du même avis.

Je dirais bien que les conditions sont ici réunies pour faire un bon seg fault.


M.


Hmmm ? Bizarre, je n'ai pas vu les frees correspondants aux mallocs.
0