Dans le langage C, les variables avec une zone de stockage automatique (auto, par défaut) sont créées sur la pile lors de l'entrée dans leur portée (généralement — fonction) et sont automatiquement détruites lors de la sortie de celle-ci.
Les caractéristiques incluent :
Exemple d'utilisation correcte et incorrecte :
int* wrong() { int x = 42; return &x; // ERREUR : x sera détruit après la sortie de la fonction } void correct() { int y = 123; printf("%d ", y); // tout va bien }
Que se passera-t-il si vous retournez l'adresse d'une variable locale depuis une fonction ?
Réponse incorrecte fréquente : « Le pointeur conservera la valeur ».
Réponse correcte : L'adresse retournée deviendra invalide après la sortie de la fonction, la zone mémoire sera à nouveau allouée pour d'autres variables automatiques ou fonctions. L'utilisation de ce pointeur — comportement indéfini.
Exemple :
int* myfunc() { int temp = 10; return &temp; // temp est détruit après le retour } int main() { int* p = myfunc(); printf("%d ", *p); // COMPORTEMENT INDÉFINI }
Histoire
Histoire
Histoire
Dans le firmware d'un enregistreur médical, un cache a été mis en œuvre sur la pile pour accélérer le traitement des données. Sous charge, la pile débordait, entraînant un redémarrage de l'appareil et une perte de données du patient.