*** stack smashing detected ***: <unknown> terminated Abandon (core dumped [Résolu]

Signaler
Messages postés
7
Date d'inscription
jeudi 14 novembre 2019
Statut
Membre
Dernière intervention
29 décembre 2019
-
FifiAbesoindaide
Messages postés
7
Date d'inscription
jeudi 14 novembre 2019
Statut
Membre
Dernière intervention
29 décembre 2019
-
Bonjour/soir, voilà j'expose mon problème. Je suis en train de faire un tableau de pointeur et j'ai une erreur que je ne comprend pas.

Logement lirelog(FILE *fe) 
{
	Logement ligne;
	fscanf(fe," %s %s %s %s %s %s", ligne.idlog,ligne.cite,ligne.type, ligne.disp, ligne.adapte, ligne.idoccup);
	//fscanf(fe," %s", ligne.cite);
	//fscanf(fe,"%s  %s  %s  %s",ligne.type, ligne.disp, ligne.adapte, ligne.idoccup);
	
	return ligne;
}

int Chargement(Logement **TLog, int maxLog)
{
	int i=0;
	Logement *log;

	FILE *fe; 
	fe=fopen("logements.don","r"); 
	if (fe==NULL)
		{ printf("pb ouverture fichier\n"); return -1; }

	log=(Logement*)malloc(sizeof(Logement));
	if (log==NULL)
	 { printf("Problème malloc\n"); fclose(fe), exit(1);}

	*log=lirelog(fe);
	TLog[i]=log;

	while(feof(fe)==0)
	{	
		if (i==maxLog)
			{ printf("Pb capacité\n"); fclose(fe); return -1;  }
		log=(Logement*)malloc(sizeof(Logement));
		if (log==NULL)
	 	{ printf("Problème malloc\n"); fclose(fe), exit(1);}
	 	i++;

		*log=lirelog(fe);
		TLog[i]=log;

	}
	return i;

}

void AffichLogement(Logement **Log, int tailleLog)
{
	int i; 
	for (i=0; i<tailleLog; i++)
	{
		printf("%s %s %s %s %s %s \n",Log[i]->idlog,Log[i]->cite, Log[i]->type,Log[i]->disp,Log[i]->adapte,Log[i]->idoccup );
	}


}

void testGlobal(void)
{
	int tailleLog, maxlog=1000;
	Logement *TLog[1000];

	tailleLog=Chargement(TLog,maxlog);
	AffichLogement(TLog, tailleLog);

}



	int main(void)
{
	testGlobal();
	return 0;	
}

typedef struct{
	char idlog[6];
	char cite[20];
	char type[10];
	char disp[3];
	char adapte[3];
	char idoccup[7];
}Logement;


Ceci est mon code. Avec ce fichier texte "logements.don":

A1000 Cezeaux chambre D A RIEN
A1001 Cezeaux studio ND A E1025
A1002 Cezeaux T1 D NA
A1003 Cezeaux T2 D NA

J'obtiens le résultat de compilation :

A1000 Cezeaux chambre D A RIEN 
A1001 Cezeaux studio ND A E1025 
A1002 Cezeaux T1 D NA A1003 


Rien d'anormal je comprend.
Or je veux désormais afficher le résultat de compilation avec ce fichier texte (seule la 3e ligne change) :

A1000 Cezeaux chambre D A RIEN
A1001 Cezeaux studio ND A E1025
A1002 Cezeaux T1 D NA RIEN
A1003 Cezeaux T2 D NA

Cependant au lieu d'obtenir ceci :

A1000 Cezeaux chambre D A RIEN 
A1001 Cezeaux studio      ND A E1025 
A1002 Cezeaux T1            D NA RIEN


J'obtiens ce message d'erreur, si une âme charitable pouvait m'éclairer je serais aux anges.

*** stack smashing detected ***: <unknown> terminated Abandon (core dumped)


Cordialement,Fifi.

4 réponses

Messages postés
430
Date d'inscription
dimanche 7 février 2016
Statut
Membre
Dernière intervention
8 janvier 2020
50
Bonjour,

Si un fichier core a été généré, il suffit de l'ouvrir avec ton débogueur pour y voir le problème exact.

Sinon une piste : ton code tel qu'il est, lit une ligne de plus que la taille réelle du fichier. L'indice
i
retourné par
Chargement()
en oublie toujours la dernière te masquant le problème (un bug peut en cacher un autre).
Ta fonction lirelog() n'a aucun moyen de retourner que les données lues sont absentes ou incohérentes, une interface
bool lirelog(FILE *fe, Logement *pLog)
permettrait un meilleur contrôle.
Messages postés
7
Date d'inscription
jeudi 14 novembre 2019
Statut
Membre
Dernière intervention
29 décembre 2019

Merci de te réponse. Je suis étudiant en informatique et je n'ai pas encore vu le type de variable 'bool' (qui doit signifier booléen si je ne me trompe). Donc je ne préfère pas utiliser cette méthode.

J'ai fais des test et il me manque une ligne de lu car le programme me dit 19 et 20 lignes sont présentes dans mon fichier. Donc comme vous l'avez souligné mon indice
i
en oublie la dernière ligne mais je vois pas comment elle peut l'oublier.

La "ligne de plus" qui est lu est-elle lié à la lecture hors de la boucle
 while(feof(fe)==0)
de la première ligne ? Car je l'ai supprimé et fait en sorte de tout lire dans la boucle désormais mais je n'obtiens pas le résultat escompté.
Messages postés
430
Date d'inscription
dimanche 7 février 2016
Statut
Membre
Dernière intervention
8 janvier 2020
50
i
représente l'index du dernier élément mis dans le tableau, donc le nombre d'éléments dans le tableau est
(i+1)
.

Oui, la fonction
feof()
n'indique pas que l'on est à la fin du fichier mais indique que la dernière opération à tenté de lire au-dela de la fin. Et si la dernière ligne se termine par un retour chariot tu liras aussi une ligne de trop.

Tu n'obtiens pas le résultat escompté! Que se passe-t-il? Ça plante toujours? Ça fait autre chose? As-tu essayé d'utiliser un débogueur? Il faut regarder plus précisément en pas à pas ce qu'il se passe. Par exemple dans
lirelog()
afficher ce qui a été lu permet de vérifier que toutes les lignes sont lues et que leur contenu est bien extrait.
FifiAbesoindaide
Messages postés
7
Date d'inscription
jeudi 14 novembre 2019
Statut
Membre
Dernière intervention
29 décembre 2019

D’accord merci pour ton aide. Je n'avais jamais utilisé de débogueur mais je vais commencer à m'y mettre. De toute façon j'aurai un jour bien besoin.
Messages postés
7
Date d'inscription
jeudi 14 novembre 2019
Statut
Membre
Dernière intervention
29 décembre 2019

Au final j'ai réussi à résoudre le problème. C'était mon fichier texte que je devais charger. Un espace était en plus à certains endroit à la place de underscore. Ce qui avait pour conséquence de décaler mon chargement de tableau. Et au final mon tableau était plein il restait des éléments non lus dans mon fichier donc ma boucle
while(feof(fe)==0)
continuait de tourner. Je passe en résolu.

Cordialement, Fifi.