Maison > Article > tutoriels informatiques > fonction malloc pour l'allocation dynamique de mémoire en langage C
Besoin d'inclure les fichiers d'en-tête :
#j'inclus
ou
#j'inclus
Déclaration de fonction (prototype de fonction) :
void *malloc(int size);
La fonction malloc est utilisée pour demander au système d'allouer un espace mémoire d'une taille spécifiée, et le type de retour est void*. En C et C++, un pointeur de type void* peut être converti en pointeur de tout autre type.
Comme le montre la déclaration de la fonction, il existe au moins deux différences entre malloc et new : new renvoie un pointeur du type spécifié et peut calculer automatiquement la taille requise. Par exemple :
int *p;
p = new int; //Le type de retour est le type int* (pointeur entier) et la taille d'allocation est sizeof(int);
ou :
int* parr;
parr = new int [100]; //Le type de retour est le type int* (pointeur entier) et la taille d'allocation est sizeof(int) * 100;
Avec malloc, nous devons calculer le nombre d'octets requis et forcer la conversion en un pointeur du type réel après le retour.
int* p;
p = (int *) malloc (sizeof(int));
Tout d'abord, la fonction malloc renvoie le type void *. Si vous écrivez : p = malloc (sizeof(int)); alors le programme ne peut pas être compilé et un message d'erreur sera signalé : "void* ne peut pas être affecté à un int *. tapez une variable." Vous devez donc passer (int *) pour lancer le casting.
Deuxièmement, le paramètre réel de la fonction est sizeof(int), qui est utilisé pour spécifier la taille requise d'une donnée entière. Si vous écrivez :
int* p = (int *) malloc (1);
Le code peut également être compilé, mais en fait seulement 1 octet d'espace mémoire est alloué. Lorsque vous y stockez un entier, 3 octets seront sans abri et directement "vivront chez le voisin" " ! Le résultat est que tout le contenu des données originales dans la mémoire suivante est effacé.
malloc peut également obtenir l'effet de new [] et demander une mémoire continue. La méthode n'est rien d'autre que de spécifier la taille de mémoire dont vous avez besoin.
Par exemple, si vous souhaitez allouer 100 espaces de type int :
int* p = (int *) malloc ( sizeof(int) * 100 ); //Alloue un espace mémoire pouvant contenir 100 entiers.
Une autre différence qui ne peut pas être vue directement est que malloc alloue uniquement de la mémoire et ne peut pas initialiser la mémoire obtenue, donc la valeur de la nouvelle mémoire obtenue sera aléatoire.
À l'exception des différentes méthodes d'allocation et de publication finale, le pointeur est obtenu via malloc ou new, et les autres opérations sont cohérentes.
Développer tout
Vous avez alloué de la mémoire deux fois. La première fois était de 3 entiers. Malheureusement, vous l'avez perdue la deuxième fois que vous avez alloué trois entiers, vous n'avez toujours pas attribué de valeur aux trois premiers entiers de la nouvelle mémoire. est directement sorti des limites et a écrit des unités int hors limites, c'est une chance que le programme ne se soit pas écrasé immédiatement
.int *p, *p1,i;
p = (int *)malloc(3*sizeof(int));
pour(i=0;i
printf("n int put:");
scanf("%d",p+i);
}
p1 = (int *)malloc(3*sizeof(int));
pour(i=0; i
printf("n int put:");
scanf("%d",p1+i);
}
for(i=0;i
for(i=0;i
Vous pouvez jeter un œil au prototype de la fonction malloc
void* malloc(int)
Le paramètre de malloc est un entier, qui représente la quantité de mémoire à demander, en octets. La valeur de retour est un pointeur vers cette mémoire, qui est un pointeur de type nul.
Et sizeof est un opérateur, grâce auquel vous pouvez obtenir le nombre d'octets en mémoire occupés par un type ou une variable, et le résultat est un entier. Donc pp=(float *)malloc(sizeof(float)); calcule d'abord sizeof(float) pour obtenir le nombre d'octets occupés par un type float en mémoire. Dans un environnement 32 bits, il devrait être de 4 octets, et le résultat est 4. Ensuite, malloc(4) demande un espace mémoire de 4 octets, renvoie l'adresse de cette zone mémoire, puis force sa conversion en type float*.
À propos des listes chaînées, chaque élément de liste chaînée stocke l'adresse de l'élément suivant ou précédent. Naturellement, chaque élément de liste chaînée occupe de l'espace mémoire, vous devez d'abord attribuer une adresse à cet élément, sinon, les données n'ont aucun endroit où être sauvegardées.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!