Allocation statique ou dynamique

Résolu
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 - 17 avril 2006 à 11:45
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 - 17 avril 2006 à 23:00
Bon alors, j'ai un exemple de programme. Mais je me pose la question de
sa validité sachant que ce que vous allez voir. C'est correct dans
certain langage comme Ada.



int main()

{

int n = 10;



{

int tab[n]; // <= Grande question

int valeur_suivante = 0;



for (int i=0 ; i<n ; i++)

{

tab[i] = i;

std::cout << i << " : " << tab[i] << std::endl;

}



std::cout << "Adresse de tab : " << (long)tab << std::endl;

std::cout << "Adresse de valeur suivante : " << (long)&valeur_suivante << std::endl;

std::cout << "Valeur de valeur suivante : " << valeur_suivante << std::endl;

}

system("PAUSE");

return 0;

}


Lorsque la fonction est appelée "n" contient une valeur fixe. C'est
aussi à ce moment la, que le tableau "tab" est créé. La différence en
Ada, c'est qu'il y a un champ spécial de déclaration de variables (type
pascal) donc il n'y a pas d'ambiguité sur la taille du tableau, meme si
la taille est un paramètre de la fonction. Si bien que le code dessus
serait bon.



Alors quelqu'un pourrait il me dire si le programme au dessus est
définitivement incorrect, ou alors il y a des cas où c'est correct.
Dans
le cas ou c'est incorrect, pourquoi est ce que le compilo ne donne pas
de message d'erreur ? Et si la preuve pouvait etre autre chose qu'une
opinion personnelle, ca serait bien :)



merci.

5 réponses

vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
17 avril 2006 à 12:21
Comme je te l'ai dit, VC++ interdit de faire ce genre d'allocation, ca explique peut être.
Je me souviens que c'était l'objet de mon premier message sur ce forum, et Kaid m'avais dit que c'était normalement interdit de faire de genre d'allocations.
Mais c'est peut-être aussi un peu risqué: j'imagine qu'il y a moins d'espace dispo dans la pile que dans le tas, du coup tu risques de te retrouver avec un stack overflow si jamais n est trop grand
3
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
17 avril 2006 à 11:47
J'ai fais une petite erreur dans le post, il n'y a pas de fonction appelée, mais simplement un nouveau bloc {}.
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
17 avril 2006 à 12:00
Déja j'ai pas bien compris quand tu dis n a une valeur fixe... n a toujours une valeur et le compilo est donc capable de l'utiliser pour réserver de l'espace dans la pile (il suffit en gros de faire un sub esp, n*4)
Du coup j'ai pas bien compris ton problème: comment le compilateur pourrait il dire des fois c'est correct et des fois c'est pas correct?
Je signale aussi que c'est gcc qui autorise int tab[n], c'est impossible sous VC++ (sauf si n est const int)
Et aussi, pourquoi tu as ouvert un nouveau bloc après int n=10?
0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
17 avril 2006 à 12:17
Pour l'histoire du bloc, c'est inutile ici, mais ca peut etre rentré
par l'utilisateur. En C, ca serait nécessaire, mais c'est vrai qu'en
C++, c'est inutile.

Pk je pose la question ? car il y a eu des postes sur le meme sujet, ou
il était dit qu'il était formellement interdit de faire ce genre de
déclaration "int tab[variable]";



Enfin s'il s'avère que "int tab[variable]" est légal, donc tous les
exemples sur ce forum ou on utilie malloc ou new pour allouer une
chaine de caractère local à un bloc {} pourrait etre remplacé par une
simple déclaration de tableau statique.

Donc finalement, on utilise l'allocation dynamique la ou parfois, c'est pas nécessaire (dans le cas des variables locales).
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
17 avril 2006 à 23:00
Voici ce j'ai compris sur le sujet :

int tab[n];
avec n autre chose qu'une constante connue à la compilation est autorisé en C depuis la norme ansi c99.
Par contre elle est toujours interdite en C++ qui nécessite que la taille du tableau soit connue à la compilation.
0
Rejoignez-nous