Ben oui: Toute adresse sur laquelle on vient de faire un free() est une adresse invalide, etc.
Mais seul NULL est testable.
Ben oui: Toute adresse sur laquelle on vient de faire un free() est une adresse invalide, etc.
Mais seul NULL est testable.
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
et on en revient à ce qu'on disait :
- inutile avant un return
- inutile si on n'a pas à tester la valeur après
- inutile si on SAIT qu'on l'écrase par une nouvelle valeur après
or doncques.... ça mange peut-être pas de pain, mais pouquoi mettre une instruction inutile ??
Dans certains cas, bien sûr que c'est utile.. Mais ce que Sve@r et moi disons, c'est que ce n'est pas une régle d'or, loin s'en faut.. Il y a plus de cas où c'est inutile que de cas où c'est utile, et c'est une des quelques remarques que j'avais d'ailleurs à propos de l'échelle de goret... (une autre étant sur le fait de déclarer une variable par ligne.. Si ta routine a 40 variables, la lecture et la compréhension sont complexifiées par rapport à les mettre sur 5 lignes... Et d'ailleurs même avec moins de variables c'est vrai...)
"Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".
Consultant indépendant.
Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
C, Fortran, XWindow/Motif, Java
Je ne réponds pas aux MP techniques
Parce que c'est peut-être inutile aujourd'hui, mais le code d'une fonction est (souvent?) appelé à évoluer durant la phase de maintenance d'un soft. Adopter une attitude idiomatique ici m'a rendu service bien des fois.
Enfin bon, je ne suis pas un programmeur très expérimenté.
Thierry
"The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
"If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow
FAQ-Python FAQ-C FAQ-C++
+
Quelques remarques.
A partir du moment où tu as appelé free() avec la valeur retournée par malloc(), le bloc pointé est libéré. Ta manip ne prouve rien, car elle invoque un comportement indéterminé (accès à un bloc libéré).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50 /* -ed- j'ai une macro globale qui s'appelle TEST et qui vaut 1... */ #undef TEST #include <stdio.h> #include <stdlib.h> int main(void) { struct TOTO { int toto1; }; struct TEST { int test1; float test2; float test3[2]; struct TOTO *toto; }; struct TEST test; if((test.toto = (struct TOTO*)malloc(50*sizeof(struct TOTO))) == NULL) { printf("erreur"); } test.test1 = 1234; int i; for(i=0;i<50;i++) { test.toto[i].toto1 = i; } printf("%d\n",test.test1); printf("%d\n",test.toto[33].toto1); //je libere la memoire de *toto, enfin je croyais /* -ed- je conseille de metre en oeuvre tout de suite les 'Bonnes Pratiques'. Remettre le pointeur à NULL apres usage. */ free(test.toto), test.toto = NULL; /* -ed- comportement indetermine... */ printf("%d\n",test.toto[33].toto1); return EXIT_SUCCESS; }
Pas de Wi-Fi à la maison : CPL
Ben si. Elle sert à être testée. On ne sait pas par quelles circonvolutions plus ou moins tordues est passé le code avant...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 free(test.toto), test.toto = NULL; ... if (test.toto != NULL) { printf("...", test.toto); ... }
Pas de Wi-Fi à la maison : CPL
"Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".
Consultant indépendant.
Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
C, Fortran, XWindow/Motif, Java
Je ne réponds pas aux MP techniques
Pas de Wi-Fi à la maison : CPL
Euh, rien à voir... Certains éditeurs de liens savent optimiser les morceaux de bibliothèques qui sont effectivement liés (en embarqué, surtout, pour des raison évidentes de taille de code...). Sur PC, c'est plutôt tout ou rien, d'où une séparation entre flottant et le reste (par exemple, libc.a, libm.a etc.)
Tu ne sais pas faire la différence entre un header et une bibliothèque. Je crois que ce n'est pas la peine de lire la suite.Ensuite je competterai en disai que les librairie disponnible sur ton ordinateur, change en fonction de ton ordi.
En général on as les même base exemple :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 #include <stdio.h> #include <stdlib.h>
Revois d'urgence les bases du langage C et tu pourrais essayer d'intervenir utilement ici...
Pas de Wi-Fi à la maison : CPL
Pas de Wi-Fi à la maison : CPL
Pas de Wi-Fi à la maison : CPL
Comment le savoir par avance ? Le fait de remettre le pointeur à NULL est un principe de programmation saine (encore appelée programmation défensive). Si c'est inutile dans 98% des cas, c'est pas génant, par contre, ce sont les 2% restant qui nous intéressent. Dans un code de 2Mlignes, j'ai pas trop de temps à perdre pour savoir si le = NULL est utile ou non. C'est comme les protections contre les inclusions multiples : c'est inutile dans 80% des cas... N'empêche qu'en faire une pratique systématique permet de 'faire le ménage'...
Pour reprendre une de tes expression pré-citée, "si il y a 40 variables au même endroit, c'est que c'est mal conçu". C'est assez pratique comme réponse (et ça peu même être assez vrai dans certains cas).Mais ce que Sve@r et moi disons, c'est que ce n'est pas une régle d'or, loin s'en fau.. Il y a plus de cas où c'est inutile que de cas où c'est utile, et c'est une des quelques remarques que j'avais d'ailleurs à propos de l'échelle de goret... (une autre étant sur le fait de déclarer une variable par ligne.. Si ta routine a 40 variables, la lecture et la compréhension sont complexifiées par rapport à les mettre sur 5 lignes... Et d'ailleurs même avec moins de variables c'est vrai...)
Je rappelle que je soutiens le principe de la réduction de la portée des variables (ça fait le ménage) et l'usage des 'contextes' (structures).
Pas de Wi-Fi à la maison : CPL
Pas de Wi-Fi à la maison : CPL
Ahlàlàlà quelle discussion. Le problème c'est que beaucoup d'arguments sont valables des 2 cotés. D'un coté il y a le programmeur alone qui maîtrise ses pointeurs et qui trouve inutile d'y mettre NULL "inutilement" (si je puis dire) et de l'autre il y a le programmeur qui bosse en équipe et qui, quand il récupère un pointeur venu d'on ne sais-où, aime bien qu'il soit à NULL s'il n'est pas encore utilisé (ce qui lui évite de se poser des questions métaphysiques)
A mon avis je pense qu'on ne pourra jamais dire avec certitude "il faut faire ceci ou cela". Nous tous, programmeurs "habitués du C" que nous sommes et qui sommes tenants d'une philosophie ou d'une autre savons ce que nous faisons et je crois que c'est suffisant.
Pour moi, le truc vraiment important à dire et à faire savoir aux débutants du C, c'est qu'on manipule toujours un pointeur avec précaution.
Mon Tutoriel sur la programmation «Python»
Mon Tutoriel sur la programmation «Shell»
Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
Et on poste ses codes entre balises [code] et [/code]
"Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".
Consultant indépendant.
Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
C, Fortran, XWindow/Motif, Java
Je ne réponds pas aux MP techniques
Pas de Wi-Fi à la maison : CPL
Pas de Wi-Fi à la maison : CPL
Le bouquin s'appelle "Développer sous Windows 95 et Windows NT 4.0" édité chez microsoft press, on le trouve encore sur amazon, j'ai précisé 95 car c'est le plus ancien mais la remarque vaut pour NT.
Autrement j'ai d'autre bouquin de richter plus récent mais ça n'apportera rien de plus à part répéter ce qui a été dit.
"The quieter you become, the more you are able to hear"
"Plus vous êtes silencieux, plus vous êtes capable d'entendre"
ptete ben.. Mais la meme machine sous Linux ne plante jamais ..
et par exemple, avec la JVM, des que je laisse tourner +4h, ca gele tout.... (comment ?? on a dit "garbage collector" ?? ) et ca se voit que c'est la memoire ... il dit "plus assez de place.. augmente la memoire virtuelle...".. et la il en sort jamais...
"Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".
Consultant indépendant.
Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
C, Fortran, XWindow/Motif, Java
Je ne réponds pas aux MP techniques
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager