Problème de mémoire avec un tableau dynamique

Résolu
cs_veler Messages postés 723 Date d'inscription dimanche 26 novembre 2006 Statut Membre Dernière intervention 23 janvier 2013 - 22 janv. 2013 à 23:32
cs_veler Messages postés 723 Date d'inscription dimanche 26 novembre 2006 Statut Membre Dernière intervention 23 janvier 2013 - 23 janv. 2013 à 08:27
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

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
23 janv. 2013 à 02:31
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
3
cs_veler Messages postés 723 Date d'inscription dimanche 26 novembre 2006 Statut Membre Dernière intervention 23 janvier 2013 2
23 janv. 2013 à 08:27
Bonjour,

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