Fonction ALLOCA 3 C

Fonction ALLOCA 3 C
L'espace qui est publié périodiquement est alloué avec la commande alloca. Le cadre de pile de l'appelant est alloué les octets de mémoire de longueur par la méthode alloca (). Une fois le code qui a invoqué alloca () est revenu à son appelant, cette mémoire intermédiaire est immédiatement publiée. Dans ce guide, nous discuterons de l'utilisation de alloca () pour attribuer l'espace mémoire à une variable sans libérer le dernier:
  • #inclure
  • void * alloca (size_t taille));

Valeur de retour

Une référence au point de départ de la région attribuée est renvoyée par la méthode alloca (). Le script se comporte de manière indéfinissable si l'affectation entraîne un débordement de pile.

Quelques confirmations

Posix.1-2001 ne fournit pas cette méthode. La méthode alloca () est connue pour avoir été présente dans 32V, 3BSD, PWB, PWB.2, et 4BSD. Il est documenté en 4.Page Web manuelle de 3BSD. La variante GNU est utilisée par Linux.

Explication

La fonction alloca () dépend du programme de compilation, ainsi que du système cible. Contrairement à l'utilisation de Malloc (3) plus gratuitement, l'utilisation peut la rendre plus efficace dans certains scénarios (3). Dans certaines circonstances, cela peut également rendre l'espace de négociation dans des programmes qui utilisent LongJMP (3) ou SiglongJMP plus facile (3). Cependant, il n'est pas invité à le consommer.

Supposons que la mémoire allouée par alloca () est réservée à l'intérieur du cadre de pile. Si en quelque sorte le retour de la méthode est ignoré par un appel de fonction à longjmp (3) ou siglongjmp, le stockage est instantanément libéré (3). Mémoire libre (3) qu'alloca () a allouée ne doit pas être tentée! Les appels alloca () sont souvent traduits à l'aide d'un script en ligne par GCC (1).

Insectes

Si le cadre de la pile peut ne pas être élargi, il ne semble pas y avoir de message de défaut. Bien que, si l'application essaie d'utiliser la mémoire non attribuée après un placement bâclé, il est qualifié pour obtenir un signal Sigsegv. Étant donné que cette mémoire de pile allouée par alloca () peut s'afficher sur la pile à l'intérieur du milieu de la région pour les paramètres de méthode sur plusieurs plates-formes, alloca () ne doit pas être utilisée dans la liste des paramètres d'un appel de méthode.

Exemple 01

Commençons par nos premiers exemples d'utilisation de la fonction alloca () de C. Tout d'abord, nous devons créer un fichier C en utilisant l'instruction tactile dans le répertoire de travail actuel du système Kali Linux. Après cela, vous pouvez essayer de l'ouvrir dans n'importe quel éditeur de votre choix pour ajouter un script C. Nous utilisons l'éditeur VIM pour ouvrir le «Allocex.Fichier C ”.


Dans le fichier vide, nous avons ajouté le code suivant. Ce code a commencé avec le «Stdio.En-tête h ”pour utiliser le flux d'entrée et de sortie standard dans le programme. Le «alloca.L'en-tête h ”a été utilisé pour utiliser la fonction alloc () c dans ce code. Ce code contient une seule fonction main () qui a initialisé une variable entière nommée «numéro» allouée avec la mémoire de la taille 4.

La boucle «For» a été initialisée et utilisée pour incrémenter la valeur de la variable «nombre» de 1 à chaque index. La prochaine boucle «For» a été utilisée pour afficher chaque valeur d'index du numéro de variable à l'aide de l'instruction de fonction printf (). Ce code est terminé ici. Nous l'avons enregistré et il est prêt pour la compilation.


Maintenant, nous avons compilé ce fichier C avec le compilateur GCC et créé son fichier d'objet nommé «Allocex.out »dans le même répertoire de travail, je.e., "travaux".


Après cela, nous avons exécuté le fichier objet nouvellement créé de ce code dans le «./" instruction. La sortie a affiché un total de 4 valeurs pour la variable particulière, i.e., Taille 4 allocation de mémoire au numéro de variable.


Changeons le numéro d'itération dans la boucle «pour», je.e., changer 4 à 5. Le code suivant a été mis à jour. Sauvons-le avant de le compiler.


Nous avons compilé le code modifié avec le compilateur GCC pour remplacer son fichier d'objet, également.


En exécution, nous avons le défaut de segmentation. C'est parce que nous avons initialisé la taille variable à 5 et en utilisant le "<” sign to iterate the variable “Number” up to 5 which are a total of 6 memory locations, i.e., should be a total of 5.

Exemple 02

Prenons un autre exemple pour attribuer la mémoire périodiquement libérée à la pile du pointeur. Nous avons utilisé les mêmes en-têtes avec l'ajout du «stdlib.en-tête h ”. La méthode principale () a été configurée avec la déclaration de certaines variables et un pointeur. Les instructions printf et scanf sont utilisées pour afficher et obtenir le numéro d'entrée de l'utilisateur tandis que la fonction alloca () alloue la mémoire à la variable de pointeur «numéro» en utilisant ce numéro particulier ajouté par un utilisateur. Si la mémoire attribuée à la variable «numéro est nul», je.e., Aucune mémoire allouée, puis le printf () affichera un message d'erreur qui lui est lié. Plus la fonction de sortie (0) terminera ce programme.

La boucle «For» utilise la fonction printf pour afficher le numéro d'index actuel et vous demande de saisir la valeur d'un index particulier à l'aide de la fonction ScanF. Quelle que soit la valeur que vous avez ajoutée, elle sera incrémentée du numéro d'index et enregistrée à la variable «Sum», la fonction printf () sera afficher la «somme» de toutes les itérations.


Nous l'avons compilé et créé son fichier d'objet.


Exécuté son fichier d'objet et il a demandé la taille de l'allocation de la mémoire, je.e., 4. Le total de 4 valeurs a été ajouté par l'utilisateur et résumé par le programme et affiché ci-dessous:

Conclusion

Il s'agit de l'utilisation de la fonction alloca () pour attribuer l'espace libre à une variable particulière, en particulier certaines piles. Vous pouvez voir que nous n'avons pas utilisé la fonction «libre ()» pour libérer l'espace alloué comme nous le faisons habituellement dans la fonction malloc ().