Maison  >  Article  >  développement back-end  >  Comment implémenter l'allocation dynamique de mémoire en langage C

Comment implémenter l'allocation dynamique de mémoire en langage C

angryTom
angryTomoriginal
2020-02-20 11:43:005019parcourir

Comment implémenter l'allocation dynamique de mémoire en langage C

Comment implémenter l'allocation dynamique de mémoire en langage C

Nous ouvrons souvent de l'espace mémoire pour le programme à l'avance, puis nous l'utilisons.

int arr[5] ;

Pour ce tableau, il faut ouvrir de l'espace au préalable lors de sa définition, et lors de l'exécution du programme, cet espace mémoire alloué existera toujours, à moins que la fonction ne soit exécutée, ce sera de l'Espace libéré . Un problème est que ce tableau ne peut pas être modifié dans le programme.

Ces problèmes nous ont causé quelques désagréments d'utilisation, la fonction malloc() est fournie en C.

Concernant la fonction malloc(), cette fonction accepte un paramètre : le nombre d'octets de mémoire requis. Ensuite, malloc() trouve un bloc de taille appropriée dans la mémoire disponible. Dans ce processus, malloc() peut renvoyer l'adresse du premier octet de cette mémoire. Cela signifie donc que nous pouvons utiliser des pointeurs pour opérer. malloc() peut être utilisé pour renvoyer des pointeurs de tableau, des pointeurs de structure, etc., nous devons donc attribuer le type de valeur de retour au type approprié. Lorsque malloc() ne trouve pas l'espace requis, il renvoie un pointeur nul.

Exemple :

Apprentissage recommandé : Tutoriel vidéo en langue c

double *p;
p=(double*)malloc(30*sizeof(double));

Dans ce programme, 30 espaces de type double sont d'abord ouverts, puis Point p à la position dans cet espace. Le pointeur pointe ici vers la première valeur double. Pas la totalité des 30 espaces doubles que nous avons ouverts. C'est comme un tableau. Le pointeur vers le tableau pointe vers l'adresse du premier élément du tableau, et non vers les éléments du tableau entier. Par conséquent, nos opérations ici sont les mêmes que pour les tableaux

p[0] est le premier élément et p[1] est le deuxième élément.

À ce stade, nous pouvons maîtriser une méthode de déclaration de tableau dynamique.

int arr[n];
p=(int *)malloc(n*sizeof(int));
//我们在这里使用的时候要元素个数乘类型字节长度,这样就达到了动态开辟内存空间。

Après avoir utilisé malloc() pour ouvrir l'espace mémoire, tout ce que nous devons considérer est de libérer l'espace mémoire Ici, C nous fournit la fonction free(). Le paramètre de free() est l'adresse renvoyée par la fonction malloc(), qui libère l'espace ouvert par la fonction malloc() précédente.

Exemple :

Pour libérer l'espace que nous avons ouvert ci-dessus, alors nous pouvons faire ceci

free(p);

Le programme appelle également la fonction exit(), qui est en mémoire Terminer le programme lorsque l’allocation échoue.

Exemple de programme :

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<malloc.h>//malloc()函数被包含在malloc.h里面
#include<stdlib.h>
int main(void)
{
    char*a = NULL;//声明一个指向a的char*类型的指针
    a = (char*)malloc(100 * sizeof(char));//使用malloc分配内存的首地址,然后赋值给a
    if (!a)//如果malloc失败,可以得到一些log
    {
        perror("malloc");
        return-1;
    }
    sprintf(a, "%s", "HelloWorld\n");//"HelloWorld\n"写入a指向的地址
    printf("%s\n", a);//输出用户输入的数据
    free(a);//释放掉使用的内存地址
    system("pause");
    return 0;//例2有无内存泄露?
}

Ce programme est principalement utilisé pour détecter des conditions de valeur de retour malloc incorrectes.

Ici, nous devons noter qu'en C, l'affectation de type (char *) est facultative, mais en C++, elle est obligatoire, donc l'utilisation de l'affectation de type facilitera le portage des programmes C vers C++.

Utilisez des tableaux dynamiques principalement pour gagner en flexibilité du programme. Nous pouvons créer autant de tableaux que nécessaire. Pas besoin de perdre de l'espace.

Pour plus de tutoriels Introduction à la programmation, veuillez faire attention au site Web PHP chinois !

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn