Où les variables de paramètre sont-elles stockées en mémoire?

J’écris du code en C et lorsque je suis tombé sur une méthode, je me suis demandé où les variables de paramètre étaient stockées en mémoire. Je sais ce qui suit:

variables globales -> stockées dans la section de code de static

varables statiques ->

variables automatiques locales (méthodes internes) -> stockées dans la stack

variables statiques locales -> stockées dans la stack

variables const locales -> stockées dans la stack

En supposant que mes hypothèses sont correctes.

mais où sont stockées les variables de paramètre? ex: int * (int x, car * c);

Merci!

EDIT: Je sais que lorsque je malloc quelque chose, il est placé sur le tas, mais disons que je déréférence le pointeur pour obtenir la valeur à l’emplacement du pointeur, est-ce également stocké dans le tas ou est-il maintenant dans la stack?

Cela dépend de beaucoup de choses différentes, la convention d’appel est la principale chose à examiner. Cette page x86 utilise différentes conventions d’appel et explique comment les parameters sont transmis à une fonction. Cette référence décrit les conventions d’appel utilisées par divers compilateurs et plates-formes C ++. En général, cela va être sur la stack de registres traversants.

Ma réponse aux instructions d’appel de fonction C ++ (nestedes) – les registres est également pertinente et contient des liens plus utiles.

Il n’y a pas de méthodes en C, fonctions ITYM.

Les variables globales, ainsi que les variables statiques, sont stockées dans les sections .data ou .bss (ci-après dénommé “segment de données”).

Les variables statiques locales sont également stockées dans le segment de données.

Les valeurs de paramètre des fonctions sont également stockées dans la stack, immédiatement avant l’adresse de retour.

Tout ce qui vit sur la stack (variables locales, parameters, etc.) peut également vivre dans des registres. C’est pourquoi la norme C n’indique pas explicitement quoi stocker où.

Les arguments de fonction (“parameters”) ne doivent pas du tout être stockés. Rappelez-vous: C utilise appel par valeur . Une valeur n’a pas besoin d’être stockée dans un emplacement de mémoire, elle peut résider dans un registre ou sa valeur peut être déduite de l’état du programme d’une manière ou d’une autre.

Par exemple, des fonctions de bibliothèque telles que strlen () ou sin (), cos (), sqrt () pourraient être implémentées dans du matériel. sin (x) peut être implémenté en stockant des valeurs correspondant à x dans des registres à fonctions spéciales, en émettant une instruction de fonction spéciale et en extrayant le résultat. (Le matériel en virgule flottante a parfois même des pseudo-instructions pour représenter par exemple Pi avec la meilleure précision possible. La valeur Pi n’est jamais transmise, seule l’instruction: “utilise Pi / 2”)

Même pour les fonctions “normales” définies par l’utilisateur, les arguments peuvent être transmis via des registres, plusieurs arguments peuvent être combinés dans un registre de grande taille, voire optimisés.

Ceci est mieux visible avec les fonctions en ligne, celles-ci peuvent totalement disparaître, car leurs fonctionnalités ont été combinées avec celles de l’appelant.

Les choses deviennent différentes lorsque la fonction prend l’adresse d’un de ses arguments (par exemple, int func(int arg) { int *p = &arg; } forcera arg à avoir une adresse), mais ce cas est relativement rare.

WRT la norme: une fonction C a un enregistrement d’activation . (Les personnes non standard l’appelleraient probablement un “cadre de stack”). Et la fonction se comporte comme si les arguments faisaient partie de ses variables locales et sortaient de leur scope une fois que la fonction est revenue. La manière dont ils obtiennent leurs valeurs est totalement hors de propos, théoriquement, cela pourrait même être fait en transmettant un message.