problème de libération de l'éspace dynamique allouée

Le
programmation
Bonsoir,
J'ai un fichier contient deux champs: objet et attribut nomm
"exemple.txt" :

2 11
4 11
10 10
5 O1
..
..

Sachant que on a la mme taille pour tous les attributs de tous les
objets dans notre exemple on a la taille = 2.
Cette taille peut changer d'un exemple l'autre donc on ne connait
pas la taille d'attribut en avance.

Je voudrais calculer la taille de l'attribut puis vrifier si on dans
ce fichier si on a au moins un objet qui possde un attribut tout 1
c'est dire la chaine "11" dans notre cas.
la fonction verifier() nous retourne 1 si il existe la chaine "11"
sinon O.

Voici mon essai :


Code :

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int verifier(int taille)
{
FILE *fp;
char *chaine,s[100],attribut[32];
int i,trouve=0,objet=0;
chaine = (char *) malloc(taille);
for(i=0; i < taille; i++)
chaine[i]='1';
chaine[taille]='';
printf("chaine=%s",chaine);
pFTrie = fopen("exemple.txt","r");
while (fgets(s, 100, fp))
{
sscanf(s,"%d%s",objet,attribut);
if(memcmp(attribut,chaine,taille))
{
free(chaine);
fclose(fp);
return 1;
}
}
free(chaine);
fclose(fp);
return 0;
}

int main()
{
FILE *fp;
int trouve=0,taille;
fp=fopen("exemple.txt");
While (fgets(s,100,fp))
sscanf(s,"%d%s",&objet,attribut);
taille=strlen(attribut);
trouve = verifier(taille);
printf("valeur de retour %d",trouve);

return 0;
}



Mais, le message suivant n'affiche pas:
printf("valeur de retour %d",trouve);

-Pourquoi ?

lorsque je lance l'excution aprs la compilation j'ai le message
suivant:
HEAP CORRUPTION DETECTED : after normal (#95) at 0*01020068.
CRT detected that the application wrote to memory after end of heap
buffer.


Ceci cause d 'instruction free chaine(); dans la fonction verifier
() car je supprime cette instruction donc l'exection se passe.
Mais, comment on va liberer l'espace dynamique loue par chaine
[taille] ?
- l'allocation et la libration de l'espace dynamique char *chaine est
bien dfinie ?
- Existe-t-il le type boolean comme un type des donnes ? comment le
dclare ?
- On peut utiliser le type boolean comme valeur de retour pour la
fonction verifier() ?
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Christian ASTOR
Le #19942191
On 17 août, 00:35, programmation
lorsque je lance l'exécution après la compilation j'ai le message
suivant:
HEAP CORRUPTION DETECTED : after normal (#95) at 0*01020068.
CRT detected that the application wrote to memory after end of heap
buffer.



Ce code n'est pas compilable : fopen() avec 1 seul paramètre, pFTrie
à la place de fp, &objet au lieu de object dans sscanf(),...
Et écriture en dehors de l'espace alloué à
chaine[taille]='';
programmation
Le #19942301
On 17 août, 15:40, Christian ASTOR
On 17 août, 00:35, programmation
> lorsque je lance l'exécution après la compilation j'ai le message
> suivant:
> HEAP CORRUPTION DETECTED : after normal (#95) at 0*01020068.
> CRT detected that the application wrote to memory after end of heap
> buffer.

Ce code n'est pas compilable  : fopen() avec 1 seul paramètre, pFTrie
à la place de fp, &objet au lieu de object dans sscanf(),...
Et écriture en dehors de l'espace alloué à
chaine[taille]='';




Voici, j'ai le modifie. Mais, le même problème.

#include #include #include
int verifier(int taille)
{
FILE *fp;
char *chaine,s[100],attribut[32];
int i,trouve=0,objet=0;
chaine = (char *) malloc(taille);
for(i=0; i < taille; i++)
chaine[i]='1';
chaine[taille]='';
printf("chaine=%sn",chaine);
fp = fopen("exemple.txt","r");
while (fgets(s, 100, fp))
{
sscanf(s,"%d%s",&objet,attribut);
if(memcmp(attribut,chaine,taille))
{
free(chaine);
fclose(fp);
return 1;
}
}
free(chaine);
fclose(fp);
return 0;
}

int main()
{
FILE *fp;
char s[100],attribut[32];
int trouve=0,taille,objet;
fp=fopen("exemple.txt","r");
while (fgets(s,100,fp)!= NULL)
sscanf(s,"%d%s",&objet,attribut);
taille=strlen(attribut);
trouve = verifier(taille);
printf("valeur de retour %dn",trouve);

return 0;
}
Christian ASTOR
Le #19942371
On 17 août, 17:05, programmation
Voici, j'ai le modifie. Mais, le même problème.



Non, tu n'as pas modifié
chaine[taille]='';
en
chaine[taille-1]='';
puisque tu débordes...
Publicité
Poster une réponse
Anonyme