0
votes

Comment allouer de manière dynamique la mémoire dans une fonction?

disons que je veux allouer de manière dynamique la mémoire mais avec une fonction au lieu de la fonction principale ().

J'ai donc essayé de le faire: xxx

alors je Réalisé: Même si la mémoire allouée sur le tas est disponible pour la durée de vie du programme, cette mémoire ne peut être référencée que par argument formel FPTR et non l'argument réel (appelons-le APTR ). Mais une fois, la fonction est excitée, cette mémoire est perdue.

alors comment puis-je affecter de manière dynamique la mémoire avec une fonction?


6 commentaires

Formal Arument FPTR et non l'argumen réel - Qu'est-ce qu'un "argument formel"? Qu'est-ce qu'un "argument réel"? Comment vont-ils différer? Vous demandez-vous comment attribuer une valeur à une variable de la portée extérieure à partir d'une fonction?


Yup, je demande comment attribuer un bloc de mémoire de Heap (quelle est la "valeur" que vous avez parlé) à l'argument réel, APTR (variable de la portée extérieure).


Alors quelque chose comme Comment changer une variable dans une fonction d'appel d'une fonction appelée? ? Attribuer un bloc de mémoire - Un pointeur n'est pas un bloc de mémoire, il s'agit simplement d'une adresse à la mémoire.


Donc, tout ce que je dois faire est de remplacer int * fptr avec int ** fptr Pour recevoir & APtr comme argument?


dynamalloc (int ** fptr) puis * FPTR = MALLOC (COLS * TAILOFOF (** FPTR)); Sinon, vous attribuez le bloc attribué à un copier du pointeur local à la fonction de sorte que l'allocation n'est jamais vue dans principale () (et essentiellement une fuite de mémoire). Appelez avec dynamalloc (& pointeur) dans principal () .


@Kamicuk @Davidthe multiple Dereferencing * Les opérateurs ont rendu plus difficile que ce n'est en réalité, mais j'ai réalisé que le concept est toujours le même. Merci beaucoup de me montrer la voie!


4 Réponses :


2
votes

Cette mémoire ne peut être référencée que par argument formel FPTR et non l'argument réel (appelons-le APtr ).

APTR ne peut pas désigner à l'objet de mémoire de tas avant l'appel sur dynamalloc () car l'objet n'a pas encore été attribué et son adresse attribué à APTR auge FPTR . Par la suite APTR faire référence l'objet de tas.

Nous devons simplement passer l'adresse du pointeur de APTR à dynamalloc () . Vous avez donc besoin d'arguments appropriés (arguments réels) et de paramètres (arguments formels) pour transmettre l'adresse du pointeur APTR entre les fonctions, comme vous le voyez ci-dessous.

Alors, comment puis-je affecter de manière dynamique la mémoire avec une fonction?

Vous le faites comme si vous le faites principal () , il n'a pas d'importance si le pointeur était déclaré à l'intérieur de principal () ou une autre fonction, Il vous suffit de passer l'adresse du pointeur APTR sur les autres fonctions, dans laquelle vous souhaitez utiliser l'objet de mémoire de tas, comme Fe: xxx < HR>

N'oubliez pas de gratuit () la mémoire de tas!


1 commentaires

Il restera intact en mémoire après la terminaison du programme . Le système d'exploitation ne revendiquera-t-il pas toute la mémoire allouée à un programme?



1
votes

ou simplement le faire comme ceci: xxx

et l'utilisation des futures: xxx

mais double point de pointeur peut se lenter Certaines conditions, répondent avec le retour dans la fucntion OD de fin, la copie de ce pointeur local est une meilleure pratique.


5 commentaires

Comme c requis, il peut être fait comme ça int * pTR = (int *) null;


Votre fonction dépend des variables globales. Ne quittez pas le programme dans une telle fonction.


Ce n'est pas la fin de la foulée, ce n'est pas un cas de le réparer, comme l'ingénieur de firmware intégré, je ferais de nombreuses autres modifications à ce code, en commençant par ce que la fonction dans ce cas est la perte de temps de processeur, à moins que votre type de wrapper soit Ce malloc qui peut vérifier les octets fuites plus tard, le bus encore, un meilleur choix est de rendre cette wrapper en ligne-avec macro.


@Johnysiemanokolano Vous dites donc que int * dynamalloc (int * fptr) est plus rapide (je suppose que c'est mieux?), C'est-à-dire une adresse de retour dans le tas, c'est mieux que la syntaxe à double pointeur? Une raison pour laquelle on utiliserait une double syntaxe de pointeur sur th th th the


En outre, j'ai lu que la valeur de retour de casting de MALLOC est une mauvaise pratique. Voir Stackoverflow.com/q/605845/10701114 . C'est pourquoi je n'ai pas lancé le mien par opposition à votre commentaire après la déclaration Malloc () . Certains disent que le casting n'est plus mauvais en fonction des commentaires sur le lien.



0
votes

Il est plus pratique d'utiliser une fonction macro, comme ceci: xxx pré>

update: p>

Le but de la macro est de résumer les détails et de faire une allocation de mémoire Moins d'erreur sujette. Avec une fonction (non-macro), nous devrions passer la taille de l'élément sous forme de paramètre car cette information est perdue lorsqu'un pointeur est transmis à un paramètre formel de type Void Pointer: P>

NewArray(&myArray, n, sizeof myArray[0]);


4 commentaires

Pourquoi macro pourquoi pas inline fonction à la place?


@Truthseeker inline est pour une fonction . New_array (PTR, N) N'AIT pas comme une fonction , plus comme PTR = FOO (N, type de PTR) .


@ Chux-RestarStaTemonica: Oui, c'est vrai. Le point que je faisait est lorsque nous pouvons résoudre un rôle régulier pour que les macro. Après avoir lu Ce . J'essaie d'éviter les macro, partout où c'est possible.


@Truthseeker alors mieux d'indiquer votre point (votre souhait d'exprimer quelque chose) que de poser une question (sonne comme si vous voulez apprendre quelque chose)



0
votes

Comme vous devez modifier le pointeur lui-même - le pointeur vers le pointeur est nécessaire xxx


2 commentaires

@Truthseeker Way extrêmement compliqué. gratuit sur le pointeur


(NOID **) & PTR - Accéder à int * via * (void **) est un comportement non défini.