Allouer dynamiquement de la mémoire

Signaler
-
Messages postés
521
Date d'inscription
dimanche 7 février 2016
Statut
Membre
Dernière intervention
16 janvier 2021
-
Bonjour,

J'apprends le c et j'ai un problème dans la compréhension de la mémoire.

Dans le code si dessous, j'ai d'abord alloué un tableau de pointeurs et ensuite j'ai alloué de la mémoire pour chaque cellule de mon tableau pour pouvoir stocker des chaines de caractères. Cependant, plus bas je refais le même mais simplement en allouant une seule fois et cela fonctionne aussi ? Pourquoi ?

Deuxièmement, pourquoi je sais entrer 5 chaines sans segmentation fault ? Mais une 6ème n'est plus possible alors que je n'ai alloué que 4 char* ?

Merci

int main(int argc, char **argv){

    /*char** tabstr = malloc(3 * sizeof(char*));
    for (int i = 0; i < 10; i++)
    {
        tabstr[i] = malloc(20 * sizeof(char));
    }*/

    char** tabstr = malloc(4 * sizeof(char*));

    tabstr[0] = "hi";
    tabstr[1] = "bye";
    tabstr[2] = "hehe";
    tabstr[3] = "a string";
    tabstr[4] = "another string";

    for (int i = 0; i < 6; i++)
    {
        printf("%s \n", tabstr[i]);
    }
}



Configuration: Windows / Chrome 87.0.4280.101

3 réponses

Messages postés
14757
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
14 janvier 2021
275
Les système d'allocations de mémoires allouent par block (caché du programme, c'est l'OS qui gère).
donc tu peux parfois dépasser un peu, mais c'est très risqué car ça dépend de l'humeur du système.
D'accord merci, j'ai une autre petite question.

Dans le code si dessous j'alloue un tableau de 2 personnes comme ceci et cela fonctionne.

    Person** tabPerson = malloc(2 * sizeof(Person*));

    tabPerson[0] = p1;
    tabPerson[1] = p2;


Mais de base je fesait toujours comme ça

    Person** tabPerson = malloc(2 * sizeof(Person*));
    for (int i = 0; i < 2; i++)
    {
        tabPerson[i] = malloc(sizeof(Person));
    }


Par contre dans la deuxième solution j'ai du mal à libérer toute la mémoire après ducoup je ne comprend pas très bien de quelle façon il faut alloué dynamiquement de la mémoire
Messages postés
13926
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
17 janvier 2021
784 > helloworld98
bonjour
ce serait-plus clair si tu montrais des programmes complets, inclus comment tu libères la mémoire.
Voila mon code complet, ici je free mon tableau et la mémoire alloué à l'interieur
Mais valgrind me dit que je n'ai pas libérer toute la mémoire, mais quand je fait free(p1) et free(p2) il me mets une erreur.

Et aussi, quand j'alloue la mémoire dans mon tableau ou non ça ne change rien au fonctionnement du programme ducoup je ne sais pas si c'est vraiment nécessaire et à quelle moment ça l'est vraiment

#include <stdio.h>
#include <stdlib.h>

typedef struct Person{
    char* name;
    int age;
}Person;

int main(int argc, char **argv){

    Person *p1 = malloc(sizeof(Person));
    p1->name = "Mark";
    p1->age = 25;
    Person *p2 = malloc(sizeof(Person));
    p2->name = "Stephan";
    p2->age = 35;

    Person** tabPerson = malloc(2 * sizeof(Person*));
    for (int i = 0; i < 2; i++)
    {
        tabPerson[i] = malloc(sizeof(Person));
    }

    tabPerson[0] = p1;
    tabPerson[1] = p2;

    for (int i = 0; i < 2; i++)
    {
        printf("%s - %d \n", tabPerson[i]->name, tabPerson[i]->age);
    }

    //free
    for (int i = 0; i < 2; i++)
    {
        free(tabPerson[i]);
    }
    free(tabPerson);
}
Messages postés
13926
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
17 janvier 2021
784
cela me semble simple.
à quel endroit fais-tu les free de p1 et de p2?
combien fais-tu de malloc, combien fais-tu de free?
ajoute à coté de chaque free, en commentaire, l'instruction contenant le malloc correspondant.
n'hésite pas à afficher les valeurs des pointeurs, après chaque malloc et avant chaque free: je pense que cela t'aidera à comprendre ton programme.
Messages postés
13926
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
17 janvier 2021
784
tu écris "quand j'alloue la mémoire dans mon tableau". peux-tu être factuel: de quelle lignes de code s'agit-il?
Messages postés
521
Date d'inscription
dimanche 7 février 2016
Statut
Membre
Dernière intervention
16 janvier 2021
68
Bonjour,

Tu dois vraiment aimer les pointeurs, tu en as utilisé beaucoup. Et même un pointeur de pointeurs. Ton code est cependant presque correct.

Ligne 21, tu décides d'allouer de la mémoire tu mémorises sa position dans
tabPerson[i]
. Mais lignes 24 et 25, tu changes d'avis et décides que les
tabPerson[i]
désignerons désormais les mêmes endroits que
p1
et
p2
. Et les 2 mémoires que tu as allouées ligne 21, que deviennent-elle? Tu as perdu leurs adresses et désormais il sera impossible de les libérer!
En supprimant les lignes 19 à 22, tu résous tout. Vois-tu pourquoi?