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 même 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 vérifier si on dans
ce fichier si on a au moins un objet qui possède 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'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.


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 louée par chaine
[taille] ?
- l'allocation et la libération de l'espace dynamique char *chaine est
bien définie ?
- Existe-t-il le type boolean comme un type des données ? comment le
déclare ?
- On peut utiliser le type boolean comme valeur de retour pour la
fonction verifier() ?
Vidéos High-Tech et Jeu Vidéo
Téléchargements
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