2010-04-20 7 views
4
void someFunc() 
{ 
    int stackInt = 4; 

    someOtherFunc(&stackInt); 
} 

Est-il le cas que l'espace d'adressage de stackInt pourrait être réattribuée après la fin someFunc, ce qui rend impropre à supposer que la valeur transmise à someOtherFunc représente la variable stackInt avec la valeur 4 que a été passé à elle? En d'autres termes, devrais-je éviter de passer des variables de pile par adresse et de m'attendre à ce qu'elles soient encore en vie après la fin de la fonction dans laquelle elles ont été initialisées?C pile/portée, la durée de vie variable après les fonctions se termine

+0

Quelqu'un me corrige si je me trompe, mais n'est-il pas prudent de passer l'adresse de 'stackInt' à' someOtherFunc'? L'espace ne sera réalloué qu'après le retour de Func - ce qui arrive seulement après que someOtherFunc est retourné. Le problème est seulement de retourner l'adresse des variables de la pile. Ainsi, si vous renvoyez '& stackInt' de' someFunc', vous êtes en train d'invoquer des problèmes, sinon vous êtes en sécurité. – Amarghosh

+0

Vous avez généralement raison, mais vous pouvez imaginer du code où someOtherFunc écarte quelque part ce pointeur (par exemple une variable globale) de sorte qu'il y ait une référence à celui-ci même après que someOtherFunc soit retourné. C'est là que vous avez des problèmes. – nall

+0

@nall Merci pour cela :) – Amarghosh

Répondre

3

Oui, définitivement.

Il n'est pas nécessaire d'éviter de passer des variables allouées à la pile par référence/pointeur, cependant, il suffit de de stocker des pointeurs ou des références aux variables affectées par la pile.

1

Après someFunc() retours et une autre fonction est appelée, l'espace qui a été utilisé pour stackInt sera utilisé pour une autre variable dans la nouvelle fonction. Par conséquent, la fonction someOtherFunc() ne peut pas supposer en toute sécurité que si elle conserve une copie du pointeur est passée, ce pointeur restera valide. Si elle cache une copie de la valeur qui a été pointée, c'est bien.

Ainsi, bien qu'il soit bien de passer des variables de la pile autour d'adresse (ainsi, par exemple someOtherFunc() pourrait modifier la valeur de stackInt et, s'il y avait un code à someFunc() qui a accédé après l'appel, la valeur pourrait ne pas être 4 encore), il n'est pas sûr de stocker le pointeur et s'attendre à pointer vers n'importe où valide après someFunc() renvoie.

0
  1. Il est absolument parfait pour passer des variables de la pile en tant que paramètres de toutes les manières possibles
  2. La pile des variables attribuées seront remplacées uniquement lorsque la fonction déclarer ces variables est achevé son exécution.

Donc, jusqu'à ce que vous reveniez de someFunc(), il n'y a pas de risque pour stackInt.

0

Tant que vous ne générez pas de nouveau thread depuis someOtherFunc et que vous utilisez stackInt, cela fonctionnera.