Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

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

3 réponses
Avatar
programmation
Bonsoir,
J'ai un fichier contient deux champs: objet et attribut nomm=E9
"exemple.txt" :

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

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

Je voudrais calculer la taille de l'attribut puis v=E9rifier si on dans
ce fichier si on a au moins un objet qui poss=E8de un attribut tout =E0 1
c'est =E0 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=3D0,objet=3D0;
chaine =3D (char *) malloc(taille);
for(i=3D0; i < taille; i++)
chaine[i]=3D'1';
chaine[taille]=3D'\0';
printf("chaine=3D%s\n",chaine);
pFTrie =3D 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=3D0,taille;
fp=3Dfopen("exemple.txt");
While (fgets(s,100,fp))
sscanf(s,"%d%s",&objet,attribut);
taille=3Dstrlen(attribut);
trouve =3D verifier(taille);
printf("valeur de retour %d\n",trouve);

return 0;
}



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

-Pourquoi ?

lorsque je lance l'ex=E9cution apr=E8s 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 =E0 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=E9e par chaine
[taille] ?
- l'allocation et la lib=E9ration de l'espace dynamique char *chaine est
bien d=E9finie ?
- Existe-t-il le type boolean comme un type des donn=E9es ? comment le
d=E9clare ?
- On peut utiliser le type boolean comme valeur de retour pour la
fonction verifier() ?

3 réponses

Avatar
Christian ASTOR
On 17 août, 00:35, programmation wrote:

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]='';
Avatar
programmation
On 17 août, 15:40, Christian ASTOR wrote:
On 17 août, 00:35, programmation wrote:

> 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 <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=%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;
}
Avatar
Christian ASTOR
On 17 août, 17:05, programmation wrote:

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...