Un détail sur la terminologie : dans la version 1, le tableau n'est pas en allocation statique mais en allocation automatique
Un détail sur la terminologie : dans la version 1, le tableau n'est pas en allocation statique mais en allocation automatique
Publication : Concepts en C
Mon avatar : Glenn Gould
--------------------------------------------------------------------------
Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !
Ouaip. Dommage que ça n'ai jamais décollé, car les gens tirent la mauvaise idée du mot "automatique" (notamment concernant la taille des tableaux).
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.
Donc solution 1 est juste et solution 2 est faute
Punaise mais il faut vraiment qu'on te tienne la main ??? Ca marche non ? Donc ce n'est pas "faux". C'est seulement que c'est pas "optimisé" !!!
Code c : 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 /** ** TAF-CH2 Pointeurs et Fichiers ** Exercice 1: Tableau Dynamique **/ #include <stdio.h> # define N 10 int main() { //déclaration des variables int *T; int i; int *pt; T = malloc(N * sizeof(int)); if (T== NULL) { printf("Echec d'allocation dynamique de la mémoire"); return -1; } for(i=0, pt=T; i<N; i++, pt++) { printf("Donner valeur de case %d :",i+1); scanf("%d", pt); } printf("\n Les elements du tableau sont : "); for(i=0, pt=T; i<N; i++, pt++) printf("%d |",*pt); free(T) ; return 0; }
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]
si je met free(pt) ; au lieu de l'insctruction free(T) ;
ou je met les deux free(T) ; et free(pT) ;
vous avez écrit cette remarque PS: tu as le droit d'indenter correctement aussi tes boucles !!! j'ai pas compris c.a.d je dois faire des commentaires dans la boucle ??
On ne doit désalloué de la mémoire qu'au variable à qui l'on a alloué de la mémoire.
Alloué, c'est à dire que l'on a "bloqué" de la mémoire pour qu'elle ne soit inutilisable par personne d'autre. Si on ne fait pas de désallocation quand on ne l'utilise plus, c'est une partie de la mémoire qui reste ainsi gelé, et donc inaccessible pour d'autre variable plus tard.
T = malloc(N * sizeof(int)); est une allocation dans les règles. On dit que à l'adresse renvoyé par le malloc, il y aurait une zone mémoire de N * sizeof(int) en taille. il faut donc désallouer cette zone en fin de programme, la dégeler, avec free(T); .
Quand on fait un malloc, le pointeur recevant l'adresse ne peut être modifié, justement pour cette raison.
int *pt fait que c'est un pointeur solitaire. Il se promène ça et là, et quand on le lui demande, pointera vers une zone mémoire prédéfinie. C'est grâce à pt que l'on naviguera dans la zone mémoire de T. Donc, pt pointera sur une adresse contenu dans la zone mémoire de T, mais n'en sera pas le gardien.
Quand à ce qui concerne l'indentation...
google : http://lmgtfy.com/?q=indenter+programme+informatique
Pour reprendre Sve@r, on ne te tiendra pas toujours la main... A toi de te renseigné sur les choses que tu ne sais pas !
Tu peux mettre free(pt - N)
Ouais, et pourquoi pas free(i) tant qu'on y est ???
Une allocation implique une seule libération (et inversement) !!!
Il me semble cependant qu'on a le droit d'écrire plusieurs fois free(T) mais je ne suis pas certain de ce que j'avance et de toute façon je ne vois pas pourquoi on irait faire cela...
Et surtout, ne pas perdre T entre les deux opérations c'est à dire surtout ne pas écrire T=autre_chose ou T++ ou T-- (ou bien être capable de le retrouver après comme ma première remarque qui se justifie par le fait qu'à la fin de ma boucle, T=pt - N mais bon, autant rester simple...)
Et sur certains (vieux) OS, la mémoire non libérée reste définitivement bloquée jusqu'au reboot !!!
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]
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