Problème de mémoire avec un tableau dynamique [Résolu]

Signaler
Messages postés
724
Date d'inscription
dimanche 26 novembre 2006
Statut
Membre
Dernière intervention
23 janvier 2013
-
cs_veler
Messages postés
724
Date d'inscription
dimanche 26 novembre 2006
Statut
Membre
Dernière intervention
23 janvier 2013
-
Bonsoir à tous,

J'apprends actuellement le C et j'ai un petit soucis.

J'ai un tableau dynamique à 2 dimensions déclaré dans ma fonction "main". Je souhaite le remplir de 1 dans une procédure (qui ne retourne aucune valeur, donc il faut passer par des pointeurs je pense), puis l'afficher depuis ma fonction main.
Seulement voila, le tableau se remplit bien dans ma procédure, mais la variable donné en paramètre reste nulle à la sortie.

Voici mon code :

void initialisation(int** tab, int n, int m) {
    int i, j;
    tab = malloc(n*sizeof(int*));
    for (i=0;i<n;i++) {
        tab[i] = malloc(m*sizeof(int));
        for (j=0;j<m;j++)
            tab[i][j] = 1;
    }
    // Si je print le tableau, il est remplit.
}

int main()
{
    int **tab;

    initialisation(tab, 5, 5);

    int i, j;
    for (i=0;i<5;i++) {
        for (j=0;j<5;j++) {
            printf("%d", tab[i][j]); // Ici, le programme plante, et à en croire le débogueur de CodeBlock, le tableau est vide.
        }
    }

    return 0;
}


Ou me suis-je trompé s'il vous plait? J'abandonne après 1h30 d'essais et de recherche sur internet :$

Merci d'avance :)

2 réponses

Messages postés
3802
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
9 janvier 2020
94
Bonjour.

C'est tout simplement que tu travailles sur la copie, et que celle-ci disparaissant au retour de la fonction, il ne se passe jamais rien.
(Ne pas oublier que tout est passé par copie, même les pointeurs. Le contenu pointé par un pointeur n'est pas copié dans ce cas précis, mais le pointeur l'est. Or si tu modifies le pointeur, en lui affectant une adresse, alors il y aura clairement un souci, vu que tu travailleras sur la copie de ce pointeur.)

Ton exemple, simplifié, donnerait ceci:
void func(int** tab)
{
  tab = 5;
}

int** tab = 0;
func(tab);
// tab reste à 0

Si on simplifie encore:
void func(int* tab)
{
  tab = 5;
}

int* tab = 0;
func(tab);
// tab reste à 0

Et encore un coup:
void func(int tab)
{
  tab = 5;
}

int tab = 0;
func(tab);
// tab reste à 0


Comme tu peux le voir, il est évident que ça ne peut fonctionner.

Deux solutions se présentent alors à toi:

1) Retourner la nouvelle adresse du tableau:
int** initialisation(int** tab, int n, int m)
{
    int i, j;
    tab = malloc(n * sizeof(int*));
    for (i=0;i<n;i++)
    {
        tab[i] = malloc(m * sizeof(int));
        for (j = 0; j < m; j++)
            tab[i][j] = 1;
    }
    return tab;
}

int** tab = 0;
tab = initialisation(tab, 5, 5);


2) Une autre solution, serait tout simplement de passer l'adresse de ton tableau à double dimension, et ainsi affecter celui-ci:
void initialisation(int*** tab, int n, int m)
{
    int i, j;
    *tab = malloc(n * sizeof(int*));
    for (i = 0; i < n; i++)
    {
        (*tab)[i] = malloc(m * sizeof(int));
        for (j = 0; j < m; j++)
            (*tab)[i][j] = 1;
    }
}

int** tab = 0;
initialisation(&tab, 5, 5);


________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
Messages postés
724
Date d'inscription
dimanche 26 novembre 2006
Statut
Membre
Dernière intervention
23 janvier 2013
2
Bonjour,

Merci pour vos explications. Je comprend beaucoup mieux le pourquoi du comment :)
Merci beaucoup, bonne journée !