Modification des argv[i] et libération de la mémoire - C - Programmation
Marsh Posté le 13-12-2005 à 19:35:04
Tiens j'avais jamais pensé à ca.
Modifier argv...
Pourquoi le main c'est pas int main(int argc, char const * const * const argv[]) ?
Marsh Posté le 13-12-2005 à 20:34:44
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ï. |
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.
Marsh Posté le 13-12-2005 à 21:24:46
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 ?
Marsh Posté le 13-12-2005 à 22:47:35
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 ?
Marsh Posté le 14-12-2005 à 00:01:37
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.
Marsh Posté le 14-12-2005 à 00:10:57
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.
Marsh Posté le 13-12-2005 à 18:59:50
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