Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
678 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Modification des argv[i] et libération de la mémoire

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Modification des argv[i] et libération de la mémoire

n°1265804
souliane
Posté le 13-12-2005 à 18:59:50  profilanswer
 

Bonjour, je voudrais simplement si je fais ça en C :
 
int main(int argc, char ** argv) {
    if (argc > 1)
        argv[1] = NULL;
    return(0);
}
 
Est ce que l'emplacement en mémoire de la chaine de caractere qui etait pointé par argv[1] sera libérée correctement à la fin de l'éxécution ? Si oui, est ce déconseillé pour autant de modifier les argv[i] ? Pourquoi ?
 
Merci bien :)

mood
Publicité
Posté le 13-12-2005 à 18:59:50  profilanswer
 

n°1265837
Mackila
Posté le 13-12-2005 à 19:35:04  profilanswer
 

Tiens j'avais jamais pensé à ca.
Modifier argv...
Pourquoi le main c'est pas int main(int argc, char const * const * const argv[]) ?

n°1265873
Elmoricq
Modérateur
Posté le 13-12-2005 à 20:34:44  profilanswer
 

souliane a écrit :

Est ce que l'emplacement en mémoire de la chaine de caractere qui etait pointé par argv[1] sera libérée correctement à la fin de l'éxécution ?


 
News flash :  

Citation :

Un groupe d'archéologues a trouvé une toute petite tablette sur le mont Sinaï.  
"Une incroyable découverte", d'après le Professeur Michel Arot, "nous pensions que les commandements étaient au nombre de dix, et nous venons d'en trouver un onzième"
 
Les experts en langue ancienne travaillent actuellement sur la signification du texte qui, traduit littéralement, donne ceci  : "Tu ne désalloueras pas ce qui n'a pas été alloué".
 
Un message pour le moins étrange en ces temps anciens. Jean Valjean, de RFI pour France Info.


 
Donc puisque tu n'as pas alloué argv[], tu t'en moques. En plus il ne grossira pas en mémoire, et mettre un pointeur à NULL ne libère rien du tout, il faut utiliser free().
 
Sinon il est bon de savoir que sur tout OS digne de ce nom, toute la mémoire occupée par ton programme sera récupérée.
La désallocation ne fait que rendre disponible, à ton programme, la mémoire qui était marquée comme "occupée". Pour le système, rien ne change... de façon directe, en tout cas.
 
Si la désallocation est extrêmement importante, c'est parce que ne pas désallouer fait que ton programme grossi de plus en plus en mémoire, phagocytant les ressources systèmes. Ca s'appelle un memory leak, et c'est l'horreur quotidienne des programmeurs C et C++.
 
 
 

souliane a écrit :

Si oui, est ce déconseillé pour autant de modifier les argv[i] ? Pourquoi ?


 
C'est déconseillé dans la mesure où ça n'a aucun intérêt, si ce n'est ajouter un risque, celui d'accéder plus tard à une valeur qui a été mise à NULL alors qu'elle n'aurait pas dû l'être.
Tout ce qui détériore la maintenabilité est à proscrire.

n°1265918
matafan
Posté le 13-12-2005 à 21:24:46  profilanswer
 

souliane a écrit :

Si oui, est ce déconseillé pour autant de modifier les argv ? Pourquoi ?


Ce n'est ni interdit, ni deconseille, et je pense qu'Elmoricq dans sa remarque precedente n'as pas remarque que des routines comme getopt (qui est quand meme courante, hein) modifient justement argv. Mais ca ne veut pas dire pour autant qu'il faut faire [i]n'importe quoi avec argv. Mettre un des element a NULL, justement, c'est probablement n'importe quoi.
 
Edit : quelqu'un peut-il m'expliquer pour quoi mon premier italique ne marche pas ?

Message cité 1 fois
Message édité par matafan le 13-12-2005 à 21:27:05
n°1265992
souliane
Posté le 13-12-2005 à 22:47:35  profilanswer
 

Merci pour vos réponses.
 
Je sais bien que faire argv[1] = NULL ne va pas libérer la mémoire. Ma question était en fait "si je modifie la valeur de argv[1], est ce que le systeme va reussir a recuperer l'emplacement memoire qui etait autrefois pointé par argv[1] ?". Question auquel vous avez très bien répondu :)
 
Bon j'explique quand même pourquoi je veux modifié argv : mon programme prend des parametres et j'ai une fonction qui vérifie si la syntaxe est correcte tout en detectant le mode de lancement, une autre qui travaille reellement avec les parametres.
 
Mon idée etait de mettre a NULL certains parametres pour que la deuxieme fonction puisse tout de suite detecter le mode de lancement du programme au lieu de refaire un truc du genre strcmp(argv[1], "blabla" ). Ca aurait ete plus simple que la premiere fonction renvoie un resultat que prend la deuxieme en entree, c'est vrai. Mais avec mon systeme je ne fais pas plus de comparaison et j'economise le passage d'un parametre dans ma fonction...
 
Ce n'est pas tant pour economiser le passage d'un parametre, je ne suis pas maniaque a ce point la. Mais c'est pour alléger le prototype de la deuxieme fonction qui prend deja de toute facon argv en parametre.
 
Vous trouvez ça ridicule ? :sweat:

n°1266035
Elmoricq
Modérateur
Posté le 14-12-2005 à 00:01:37  profilanswer
 

matafan a écrit :

Ce n'est ni interdit, ni deconseille, et je pense qu'Elmoricq dans sa remarque precedente n'as pas remarque que des routines comme getopt (qui est quand meme courante, hein) modifient justement argv.


 
Si mes souvenirs sont bons, getopt() peut trier les éléments de argv[]
C'est vrai que c'est une modification. Mais il n'y a pas d'altération des données en soi.

n°1266045
olivthill
Posté le 14-12-2005 à 00:10:57  profilanswer
 

Citation :

Edit : quelqu'un peut-il m'expliquer pour quoi mon premier italique ne marche pas ?

Parce qu'il avait argv[i] dans ta citation précédente, avec [i] qui indiquait le début de l'italique. Mais le style était réinitialisé à la fin de la citation, bien que le programme ne considérait que l'italique ne s'arrêtait qu'avec le tag de fin d'italique après quoi.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Modification des argv[i] et libération de la mémoire

 

Sujets relatifs
Date de modification d'un fichier et VC++ 6QT, taille mémoire des programmes ??
[.NET C#, DataTable] Modification d'une row et répercution graphiqueModification de nom de champs incrémentés
Modification sur les recordsetsOptimisation mémoire
Taille mémoire des variablesliberation memoire
[Delphi] Impossible de liberer la mémoire d´un gif 
Plus de sujets relatifs à : Modification des argv[i] et libération de la mémoire


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR