Allouer dynamiquement de la mémoire

Fermé
helloworld98 - 3 janv. 2021 à 14:50
Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 - 3 janv. 2021 à 19:10
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

NHenry Messages postés 15173 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 21 décembre 2024 350
3 janv. 2021 à 15:33
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.
0
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
0
yg_be Messages postés 23405 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 20 décembre 2024 1 557 > helloworld98
3 janv. 2021 à 16:07
bonjour
ce serait-plus clair si tu montrais des programmes complets, inclus comment tu libères la mémoire.
0
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);
}
0
yg_be Messages postés 23405 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 20 décembre 2024 1 557
3 janv. 2021 à 16:33
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.
0
yg_be Messages postés 23405 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 20 décembre 2024 1 557
3 janv. 2021 à 17:54
tu écris "quand j'alloue la mémoire dans mon tableau". peux-tu être factuel: de quelle lignes de code s'agit-il?
0
Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 101
3 janv. 2021 à 19:10
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?
0