2010-04-09 6 views

Répondre

2

Une possibilité est ...

#include <stdio.h> 

void call(int *a) 
{ 
    int b; 

    if (&b > a) 
     printf("Stack grows up.\n"); 
    else 
     printf("Stack grows down.\n"); 
} 

int main() 
{ 
    int a; 
    call(&a); 
    return 0; 
} 
+0

Cela suppose que le compilateur en question transmet des paramètres sur la pile et que les variables locales sont également attribuées à partir de la pile. Ce n'est pas garanti et c'est, en effet, assez inefficace. –

+0

Cela dépend fortement de la façon dont le compilateur implémente les appels de fonction et les variables locales. – tur1ng

+0

Je voudrais ajouter '\ n' à la fin des chaînes. – ndim

0

approche Brute force est de remplir votre mémoire avec une valeur connue dire 0xFF. Poussez quelques objets sur la pile. Faites un vidage de la mémoire. Poussez plus d'objets sur la pile. Faites un autre vidage de mémoire.

4

Ceci est très dépendant de la plate-forme, et même dépendant de l'application.

Le code affiché par Vino ne fonctionne que dans les cibles où les paramètres sont transmis sur la pile ET les variables locales sont allouées à partir de la pile, dans cet ordre. De nombreux compilateurs attribuent des adresses mémoire fixes aux paramètres ou transmettent des paramètres dans des registres. Bien que commun, le fait de passer des paramètres sur la pile est l'un des moyens les moins efficaces d'obtenir et de retirer des données d'une fonction.

Regardez le désassemblage de votre application compilée et voyez quel code est généré par le compilateur. Si votre cible dispose de commandes de manipulation de pile natives (telles que PUSH et POP) que le compilateur utilise, le document de documentation/référence de la CPU vous indiquera dans quelle direction la pile se développe. Cependant, le compilateur peut choisir d'implémenter sa propre pile, auquel cas vous devrez faire quelques recherches. Ou, lisez le pointeur de la pile, poussez quelque chose sur la pile et relisez le pointeur de la pile. Comparez les résultats de la première et de la deuxième lecture pour déterminer la direction dans laquelle le pointeur se déplace.

Pour référence future: si vous incluez quelques détails sur votre architecture cible (embarqué? PC? Linux, Windows? GCC? VC? Watcom? Blah blah blah) vous obtiendrez des réponses plus significatives.

+0

+1 pour la première déclaration. –

0

Créer une fonction avec de nombreuses variables locales.
Désactiver les optimisations. Soit vous imprimez le langage d'assemblage. Ou lors du débogage, affichez en tant que source mixte et langage d'assemblage. Notez le pointeur (ou le registre) de la pile avant l'exécution de la fonction. Parcourez une seule fois la fonction et observez le pointeur de la pile.

En général, le fait qu'un compilateur utilise des pointeurs de pile incrémentés ou décrémentés est un problème mineur tant que le problème est cohérent et fonctionne. C'est une question qui occupe rarement mon esprit. J'ai tendance à me concentrer sur des sujets plus importants, tels que la qualité, la correction et la robustesse. Je vais faire confiance au compilateur pour gérer correctement la manipulation de la pile. Je ne fais pas confiance aux fonctions récursives, en particulier sur les plateformes intégrées ou restreintes.

Questions connexes