Allocation correcte en C

Allocation correcte en C - C - Programmation

Marsh Posté le 04-11-2005 à 11:17:30    

Salut,
 
Dans mon cours d'algo/c la prof fait des allocations pour les tableaux qui me semble
tout a fait incorrecte et même franchement crado, de type :
 
int n, T[n];
printf("Taille du tableau?" );
scanf("%d", &n);
 
Moi j'ai répliqué qu'il fallait faire un jolie malloc mais selon elle son truc est bon...
 
Alors, est-ce qu'on a le droit de faire ca?

Reply

Marsh Posté le 04-11-2005 à 11:17:30   

Reply

Marsh Posté le 04-11-2005 à 11:23:25    

Les VLA (Variable-Length Array) existent depuis la norme C99, maintenant je ne connais pas encore de compilateur qui le gère de manière fiable.
Je crois que gcc l'implémente partiellement.
 
Donc vaut mieux faire un malloc(), en effet.
Et puis au passage, scanf() utilisé comme ça est une belle source de plantages.


Message édité par Elmoricq le 04-11-2005 à 11:24:09
Reply

Marsh Posté le 04-11-2005 à 11:35:53    

bien répondu. Demande lui ce qu'il se passe si la valeur de n n'est pas initialisé (échec de scanf) ou bien a une mauvaise valeur (négative, 0, ou énorme) ... ben il se passe pour ainsi dire rien : tu n'a aucun moyen de savoir si l'allocation de ton tableau a réussie ou échouée. Plantage en vue ...
 
Les VLA c'est surtout pas fait pour ce genre d'usage. C'est une petite douceur quand on a la certitude que n est borné dans des valeurs acceptables et que ça va pas péter la pile. Mais surtout pas pour une entrée utilisateur.

Reply

Marsh Posté le 04-11-2005 à 11:41:41    

Taz a écrit :

Demande lui ce qu'il se passe si la valeur de n n'est pas initialisé (échec de scanf) ou bien a une mauvaise valeur (négative, 0, ou énorme) ... ben il se passe pour ainsi dire rien : tu n'a aucun moyen de savoir si l'allocation de ton tableau a réussie ou échouée. Plantage en vue ...


 
De fait, je n'avais même pas envisagé cet aspect. La norme dit quoi si n n'est pas défini, c'est géré ou le comportement est indéfini ?
 
Faut que j'aille jeter un oeil.

Reply

Marsh Posté le 04-11-2005 à 12:13:20    

Bon, j'ai fouiné dans tout ce que j'ai pu trouver concernant les VLA.
 
Ca donne deux points :

  • même si le compilateur supporte les VLA, ta prof a méchament tort : l'allocation d'un VLA se fait lors de sa définition, ensuite tu auras beau changer n, la taille de ton VLA ne variera pas.  Ce qui signifie que dans l'exemple que tu as posté, ton VLA est de taille indéfini, puisque n vaut potentiellement n'importe quoi.


  • Quant à la validité de n lors de la définition de ton VLA, si n n'est pas dans l'intervalle correct, le comportement est indéfini. Autrement dit, soit le compilateur est sympa et te mets un tableau vide, soit le programme plante, soit le compilateur a envie de mettre une taille de 42... bref, on ne peut pas savoir. Vaut mieux s'assurer que tout est ok avant de définir un VLA.


 
Voilà voilà...

Message cité 1 fois
Message édité par Elmoricq le 04-11-2005 à 12:14:12
Reply

Marsh Posté le 05-11-2005 à 16:35:45    

Reply

Marsh Posté le 05-11-2005 à 17:06:38    

coup de pelle dans le cul je vous dit :o

Reply

Marsh Posté le 07-11-2005 à 13:23:12    

Elmoricq a écrit :

Bon, j'ai fouiné dans tout ce que j'ai pu trouver concernant les VLA.
 
Ca donne deux points :

  • même si le compilateur supporte les VLA, ta prof a méchament tort : l'allocation d'un VLA se fait lors de sa définition, ensuite tu auras beau changer n, la taille de ton VLA ne variera pas.  Ce qui signifie que dans l'exemple que tu as posté, ton VLA est de taille indéfini, puisque n vaut potentiellement n'importe quoi.


  • Quant à la validité de n lors de la définition de ton VLA, si n n'est pas dans l'intervalle correct, le comportement est indéfini. Autrement dit, soit le compilateur est sympa et te mets un tableau vide, soit le programme plante, soit le compilateur a envie de mettre une taille de 42... bref, on ne peut pas savoir. Vaut mieux s'assurer que tout est ok avant de définir un VLA.


 
Voilà voilà...


 
Hum... j'ai connu une école à Rennes où la prof (prof d'algo) avait TOUJOURS raison. Et si l'élève lui prouvait qu'elle avait tord (ce qui était relativement fréquent), ben l'élève n'avait plus jamais de note dépassant 6.
J'espère pour guguy que ce n'est pas la même prof...


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 07-11-2005 à 13:31:26    

:/
 
Une catégorie de gens que je méprise tout particulièrement.

Reply

Marsh Posté le 07-11-2005 à 17:22:32    

l'université :)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed