Allocation statique ou dynamique [Résolu]

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

Votre réponse

5 réponses

Meilleure réponse
Messages postés
6539
Date d'inscription
lundi 16 décembre 2002
Dernière intervention
22 août 2010
3
Merci
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

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 106 internautes ce mois-ci

Commenter la réponse de vecchio56
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Dernière intervention
28 juillet 2008
0
Merci
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
Messages postés
6539
Date d'inscription
lundi 16 décembre 2002
Dernière intervention
22 août 2010
0
Merci
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
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Dernière intervention
28 juillet 2008
0
Merci
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
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Dernière intervention
3 juillet 2006
0
Merci
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.