Erreur de compilation

Fermé
momo2202 - 19 févr. 2009 à 10:59
 momo2202 - 19 févr. 2009 à 16:29
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

3 réponses

Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
19 févr. 2009 à 11:25
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
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842
19 févr. 2009 à 11:35
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
Merci Fiddy ton explication était claire et j'ai compris.

Cordialement
momo2202
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
19 févr. 2009 à 11:47
0
Merci Char Sniper, j'ai retrouvé sur ton lien l'article qui explique le principe des tableaux à plusieurs dimensions.

Cordialement
momo2202
0