Allocation statique ou dynamique [Résolu]

luhtor 2023 Messages postés mardi 24 septembre 2002Date d'inscription 28 juillet 2008 Dernière intervention - 17 avril 2006 à 11:45 - Dernière réponse : ymca2003 2070 Messages postés mardi 22 avril 2003Date d'inscription 3 juillet 2006 Dernière intervention
- 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.
Afficher la suite 

Votre réponse

5 réponses

vecchio56 6539 Messages postés lundi 16 décembre 2002Date d'inscription 22 août 2010 Dernière intervention - 17 avril 2006 à 12:21
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de vecchio56
luhtor 2023 Messages postés mardi 24 septembre 2002Date d'inscription 28 juillet 2008 Dernière intervention - 17 avril 2006 à 11:47
0
Utile
J'ai fais une petite erreur dans le post, il n'y a pas de fonction appelée, mais simplement un nouveau bloc {}.
Commenter la réponse de luhtor
vecchio56 6539 Messages postés lundi 16 décembre 2002Date d'inscription 22 août 2010 Dernière intervention - 17 avril 2006 à 12:00
0
Utile
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?
Commenter la réponse de vecchio56
luhtor 2023 Messages postés mardi 24 septembre 2002Date d'inscription 28 juillet 2008 Dernière intervention - 17 avril 2006 à 12:17
0
Utile
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).
Commenter la réponse de luhtor
ymca2003 2070 Messages postés mardi 22 avril 2003Date d'inscription 3 juillet 2006 Dernière intervention - 17 avril 2006 à 23:00
0
Utile
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.
Commenter la réponse de ymca2003

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.