2009-12-05 5 views
0

Je l'exécution de ce code Cordre d'allocation sur la pile

#define STACKSIZE  65536  

      char d[STACKSIZE]; 
      if (((int) &d[STACKSIZE-1]) - ((int) &d[0]) + 1 != STACKSIZE) { 
       Printf ("Stack space reservation failed\n"); 
       Exit(); 
      } 

      printf("Allocated from %d to %d so for %d bytes\n", &d, d+sizeof(d), sizeof(d)); 

      auto int a = 3; 
      printf("Now the stack pointer is on %d\n",&a); 

Et j'obtenir en sortie de Numéroté -4262832 à -4197296 donc pour 65536 octets Maintenant, le pointeur de la pile est sur -4262836

Cela signifie que la variable "a" est placée sur la pile APRES le tableau. Mais si j'utilise un tableau de longueur variable (un tableau dont la longueur est définie dans l'exécution), j'ai le comportement inverse: a est placé sur la pile AVANT le tableau.

Ceci est le code (il est le même, mais la taille de la matrice est paramétré dans l'exécution)

#define STACKSIZE  65536  

      int i = 1; 
      char d[i*STACKSIZE]; 
      if (((int) &d[STACKSIZE-1]) - ((int) &d[0]) + 1 != STACKSIZE) { 
       Printf ("Stack space reservation failed\n"); 
       Exit(); 
      } 

      printf("Allocated from %d to %d so for %d bytes\n", &d, d+sizeof(d), sizeof(d)); 

      auto int a = 3; 
      printf("Now the stack pointer is on %d\n",&a); 

Ceci est la sortie

Numéroté de -4262856 -4197320 de sorte à 65536 octets Maintenant le pointeur de pile est sur -4197312

Alors, quel est le problème? Comment puis-je le résoudre (en utilisant un tableau de longueur variable et en mettant des variables sur la pile après).

Merci!

+0

Pouvez-vous s'il vous plaît formater le code et mettre dans la balise appropriée pour indiquer quelle langue. Si c'est C, le non Printf avec un P majuscule - puis corriger le code pour le rendre plus clair pour les autres à lire s'il vous plaît? – t0mm13b

Répondre

1

Vous ne pouvez pas. Et vous ne devriez pas se soucier où les variables sont, le compilateur pourrait les optimiser tout de suite de toute façon.

Bien que cela dépende beaucoup du système, les compilateurs vont généralement allouer juste des tableaux de taille variable après tout le reste, puisque c'est juste une question de croissance de la pile pour faire de la ruine pour les tableaux. Si le compilateur met des variables après cette zone, il doit y accéder indirectement via les tailles des tableaux de taille dynamique.