Parce que, dans C, de déclaration et d'initialisation sont délibérément différentes étapes. Ils sont délibérément différent parce que c'est la façon dont C est conçu.
Quand vous dites ce à l'intérieur d'une fonction:
void demo(void)
{
int *param;
...
}
Vous dites: "mon cher compilateur C, lorsque vous créez le cadre de pile pour cette fonction, n'oubliez pas de réserver sizeof(int*)
octets pour stocker un pointeur." Le compilateur ne pas demander ce qui se passe là - il suppose que vous allez dire à bientôt. Si vous ne le faites pas, il existe peut-être un meilleur langage pour vous ;)
Peut-être qu'il ne serait pas diaboliquement difficile de générer de la sécurité de la pile de compensation de code. Mais il faudrait être appelé à chaque appel de fonction, et je doute que beaucoup de développeurs C apprécierait de les frapper quand ils vont juste pour le remplir eux-mêmes de toute façon. D'ailleurs, il y a beaucoup de choses que vous pouvez faire pour les performances si vous êtes autorisé à être flexible avec la pile. Par exemple, le compilateur peut faire de l'optimisation...
Si votre function1
en appelle un autre function2
et stocke sa valeur de retour, ou peut-être il ya certains paramètres passés en function2
qui ne sont pas modifiées à l'intérieur d' function2
... nous n'avons pas à créer de l'espace supplémentaire, n'avons-nous? Suffit d'utiliser la même partie de la pile pour les deux! Notez que cela est en conflit direct avec le concept de l'initialisation de la pile avant chaque utilisation.
Mais dans un sens plus large, (et à mon avis, plus important encore) qu'il est aligné avec C la philosophie de ne pas faire beaucoup plus que ce qui est absolument nécessaire. Et cela s'applique si vous travaillez sur un PDP11, un PIC32MX (ce que j'utilise pour) ou un Cray XT3. C'est exactement pourquoi les gens pourraient choisir d'utiliser le C à la place des autres langues.
- Si je veux écrire un programme sans trace d'
malloc
et free
, je n'ai pas à! Pas de gestion de la mémoire est imposé à moi!
- Si je veux bits-pack et le type de jeu de données de l'union, je peux! (Tant que j'ai lu de mise en œuvre de notes sur la norme de respect, bien sûr.)
- Si je sais exactement ce que je fais avec mon frame de pile, le compilateur n'a pas à faire autre chose pour moi!
En bref, lorsque vous demandez le compilateur C pour sauter, il ne demande pas à quelle hauteur. Le code résultant ne sera probablement même pas redescendre.
Comme la plupart des gens qui choisissent de développer en C, comme de cette façon, il a assez d'inertie pour ne pas changer. Votre façon peut-être pas intrinsèquement mauvaise idée, c'est juste pas vraiment demandé par de nombreux autres développeurs C.