begin process at 2012 02 11 05:48:36
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Divers

 > 

Débutant(e)

 > 

Utilisation de free avec les structures


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Utilisation de free avec les structures

jeudi 30 novembre 2006 à 14:42:47 | Utilisation de free avec les structures

timy94

Je dispose de deux structures identiques . L'une est la principale l'autre est une structure temporaire.
La structure principale MYSTRUCT est visible à l'interieur du main(), la structure tempo n'est visible que dans une fonction TOTO.
main () {
      struct tar ** MYSTRUCT ;

   //Programme

     La fonction TOTO est appelé à l'interieur du main, comme ceci
     
    TOTO (MYSTRUCT);
   return 0;

}


void TOTO (struct tar **  p) {

   struct tar * tempo1;

   tempo1 = (struct tar *) calloc (1,sizeof (struct tar));

      /**********/
       //Boucle [j][ i] de tri pour ranger les strucutures  j++ i++
     
       tempo1 = p[kmax];

      p[kmax] = p[i] ;

      p[i] = tempo1;

   // pour liberer la strucutre tempo

      free (tempo1 );

}

En faite quand je libère tempo1 je touche aussi à la strucutre p [dernier i]
car quand je fait tempo1 = p[kmax], tempo1 contient l'adress de p[kmax] et à la fin de mon tri
tempo1 pointe sur le dernier p[kmax]. quand je fait free (tempo1) je libère de fait p[kmax].  Arglll!

Question 1 ;est-il utile de liberer la zone memoire de la tructure tempo1 avant de sortir de la fonction. Ou est-elle liberée en sortie de la fonction.

Question 2 ;j'ai fait pointé le pointeur tempo1 sur une zone vide en fin de boucle est je 
                     fais  free, comme ceci
                        tempo1 = 0;
                        free (tempo1);
                  trempo1 = 0 n'est pas dangereux?

Question 3; free (tempo1) fait quoi au juste? Il libère la zone pointée vers la strucutre et initialise le pointeur?

MERCI 

Timy94

jeudi 30 novembre 2006 à 15:38:45 | Re : Utilisation de free avec les structures

SAKingdom

Membre Club
1. Allocation dynamique = libération manuelle obligatoire. Sinon, libérer en fin de programme par Windows mais mieu vaut libérer manuellement. Aucun risque comme ça.

2. Mieu vaut pas libérer un pointeur nulle. Il pourrait ce produire des exceptions.

3. Si j'ai bien compris, tempo1 est un pointeur et d'après le code, il pointe sur p[kmax]. Si tu fais free(tempo1), tu libère donc p[kmax].

C++ (@++)

jeudi 30 novembre 2006 à 15:59:27 | Re : Utilisation de free avec les structures

timy94

Voila la fonction tri avec en fin les free

/********************************************************************************

* *

* Fonction : tri_tar *

* *

* Objet : Tri du tar pour affichege *

* *

********************************************************************************/

 

void tri_tar (struct tar ** p, int nb, char * critere) {

 

/*------------------------------ DECLARATIONS ------------------------*/

int i,j=0, kmax=0;

struct tar * tempo1;

char DateKmax[12];

char DateJ [12];

int numpara = 0;

int indice = 0;

char * p_tmp;

 

 

/*---------------------------- DEBUT DE TRAITEMENT --------------------*/

 

p_tmp = (char * ) malloc (255);

tempo1 = (struct tar *) calloc (1,sizeof (struct tar));

//Boucles de tri

for (i = 0 ; i < nb ; i++) {

kmax = i;

for (j = i+1; j <= nb ; j++) {

if (!strcmp(critere,"droits")) if (strcmp (p[kmax]->droits,p[j]->droits) > 0) kmax = j;

if (!strcmp(critere,"groupe")) if (strcmp (p[kmax]->groupe,p[j]->groupe) > 0) kmax = j;

if (!strcmp(critere,"chemin")) if (strcmp (p[kmax]->chemin,p[j]->chemin) > 0) kmax = j;

if (!strcmp(critere,"nom")) if (strcmp (p[kmax]->nom, p[j]->nom) > 0) kmax = j;

if (!strcmp(critere,"taille")) if (atoi(p[kmax]->taille) > atoi(p[j]->taille)) kmax = j;

if (!strcmp(critere,"date")) {

//Extraction de la date de kmax

numpara = 0;

indice = 0;

while (p[kmax]->date [indice]!='\0') {

//"indice" est incrémenté par scanligne

scanligne (p[kmax]->date,p_tmp,&indice, '-', '\0');

switch (numpara) {

case 0:

strcpy (DateKmax,p_tmp); break;

case 1:

strcat (DateKmax,p_tmp); break;

case 2:

strcat (DateKmax,p_tmp); break;

}

numpara++;

}

//Extraction de la date de j

numpara = 0;

indice = 0;

while (p[j]->date [indice]!='\0') {

//"indice" est incrémenté par scanligne

scanligne (p[j]->date,p_tmp,&indice, '-', '\0');

switch (numpara) {

case 0:

strcpy (DateJ,p_tmp); break;

case 1:

strcat (DateJ,p_tmp); break;

case 2:

strcat (DateJ,p_tmp); break;

}

numpara++;

}

if (atoi(DateKmax) > atoi(DateJ)) kmax = j;

}

}

//Permutation des valeur après compar aision de deux valeurs

tempo1 = p[kmax];

p[kmax] = p[i] ;

p[i] = tempo1;

}

//strcpy(tempo1.nom,"VIDE");

tempo1=0;

free (tempo1 );

free (p_tmp );

}



Timy94

dimanche 3 décembre 2006 à 20:46:00 | Re : Utilisation de free avec les structures

Matt67

Bonsoir, Dans ta fonction toto, tu n'as pas besoin d'allouer de la memoire pour tempo1 car tu lui affectes un pointeur (tempo1 = p[kmax]) : void TOTO (struct tar ** p) { struct tar * tempo1 = NULL; /**********/ //Boucle [j][ i] de tri pour ranger les strucutures j++ i++ tempo1 = p[kmax]; p[kmax] = p[i] ; p[i] = tempo1; } Bonne soirée, Bertrand


Cette discussion est classée dans : free, struct, tar, tempo1, kmax


Répondre à ce message

Sujets en rapport avec ce message

Probleme de reception dans un serveur visual C++ pour windows [ par alfred ] Salut a tous!!g un probleme dans mon serveur le recv renvoie la valeur -1 et je ne vois pas pouquoi.voici les source du client et du serveurLe Serveur connexion à MySQL chez Free [ par Xs ] Salut !je cherche a faire un prog, sous dos, qui peut se connecter a une base de donnée SQL hébergée chez Free.comment fais-t-on ? (ca va des sockets fichier.h [ par bidules ] Bonjour,j'aimerais savoir s'il est possible de mettre des structures dans un fichier d'entete.Car j'ai fais l'essai mais lors de la compilation pour c Lecture/Ecriture/Modification d'une structure dans un fichier [ par paniX ] Bonjour. Alors voici mon probleme:j'ai créé une structure client qui a cette forme :struct client{ int id; char nom[30]; char prenom[30]; char adresse struct constante [ par zarkin ] Bonjour,Je suis ss Dev-C++.Peut-on définir une structure constante en l'initialisant à partir d'une autre structure constante ?ex:const type1 MaConsta problème de pointeur et d'objet pointé [ par leptit ] Bonjour, Je vous présente le problème en C:struct assoc { int l, *n ; }*n est un pointeur vers une alloc dynamique de memoirestyle tableau d'entier.Je struct [ par ready4 ] Je ne sais pas comment initialiser mes moteurs //intialisation moteursM1 = {2, 1, 1, 2, 0, 0, 120};M2 = {8, 4, 4, 8, 0, 0, 80};M3 = {32, 16, 16, 32, 0 Passer un tableau en parametre d'une fonction [ par julien20vt ] Voila mon probleme:J'ai déclaré une structure Nom_Struct, j'initialise un tableau de Nom_Struct :Nom_Struct maStruct[1000] Ensuite j'ai la fonction s allocation dynamique [ par none77 ] Bonjour,j'ai un petit prog dans lequel j'utilise deux tablo dynamiques (j'utilise malloc() )A la fin je dois donc faire des free().Mon pb est ke lorsq PING sous protocole TCP [ par ivdz ] Bonjour, J'ai besoin de votre aide. Je travaille sous C++ Builder 6. Je dois envoyer un message ICMP de Type Echo Request puis récupérer le message


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,856 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales