Erreur de compilation

momo2202 -  
 momo2202 -
Bonjour,

lorsque je compile le petit programme suivant:

========================================

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

static void init_tab(char **tab);/*fct qui initialise un tableau*/

int main(void)
{
char tab[2][2];
init_tab(tab);
return EXIT_SUCCESS;
}

static void init_tab(char **tab)
{
tab[0][0]=' ';
}

=========================================

J'obtiens un warning de compilation qui dit :
tab.c: Dans la fonction «main» :
tab.c:10: attention : passing argument 1 of «init_tab» from incompatible pointer type

De plus quand j'execute le programme :
il me renvoi segment fault pour l'affectation : tab[0][0]=' '

Ce que je ne comprend pas c'est que comme tab a une mémoire allouée définitivement, pourquoi j'ai ces messages d'erreur.

Merci de votre aide.

Cordialement
momo2202
Configuration: portable acer aspire 3015
linux ubuntu
firefox

3 réponses

  1. Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 331
     
    Le problème viens du fait, comme je l'ai appris à mes dépend, que tableaux et pointeurs ne sont pas la même chose !
    En tableau 1D, ça se passe relativement bien car il y a une certaine équivalence (un tableau est une espèce de char*const : un pointeur constant) mais le tableau à deux dimensions n'a rien à voir avec un pointeur double.
    char t[2][2] aloue 2*2=4 espaces mémoire. Un double pointeur ce n'est pas la même philosophie, c'est un tableau de tableau, c'est à dire que la case t[i] contient un tableau qui n'a pas forcément la même taille que t[j].
    Il y avait une bonne explication de ce problème dans le forum, un gars qui m'avais plutôt bien expliqué ça, mais je n'arrive pas à remettre la main dessus.
    0
  2. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
     
    Salut,
    En fait, en C, on envoie pas le tableau mais l'adresse du pointeur. Donc quand tu fais void init_tab(char *tab); ou void init_tab(char tab[]), ça revient exactement au même. Pour un tableau à 2D, c'est pareil, mais là le compilateur a un souci. Il ne peut pas savoir s'il s'agit d'un tableau par exemple de 2 lignes 4 colonnes ou de 1 ligne 8 colonnes (ou autre). D'où le message d'erreur. Pour ça, il faut donner la dimension du nombre de colonnes. Ce qui donne le prototype suivant :
    void init_tab(char tab[][2]);
    0
    1. momo2202
       
      Merci Fiddy ton explication était claire et j'ai compris.

      Cordialement
      momo2202
      0