Votre question

Passage de l'adresse d'un tableau de caractères en arguments. (Lang C)

Tags :
  • Programme
  • Programmation
Dernière réponse : dans Programmation
18 Décembre 2009 20:48:15

Bonjour,

mon tableau de caractère est déclaré de la façon suivante :

char tableau[]="exemple";

j'aimerais faire passer l'adresse de ce tableau en argument d'une fonction de la façon suivante.

fonction(&tableau);

J'ai écrit le prototype de ma fonction comme ceci :

void fonction(char** tableau);

A la compilation j'obtiens un warning, qui prétend que le type de ce que je veux faire passer en argument, et le type de l'argument qu'attend la fonction sont incompatibles ("array[8] not compatible with pointer to char").

A l'exécution le programme plante...

en revanche si je déclare ma chaine de caractère comme ceci:

char* tableau="exemple"

Cela fonctionne...

Serait il possible d'avoir une explication?

D'avance merci!

Autres pages sur : passage adresse tableau caracteres arguments lang

a b L Programmation
18 Décembre 2009 22:56:26

En C un tableau est une adresse (pointant sur le premier élément du tableau).
Donc tableau est déjà un pointeur:
fonction(tableau)
void fonction(char * tableau).

Pour ton cas, tu passes un pointeur sur un tableau de taille fixe alors qu'il attend un pointeur sur un pointeur (pas de taille fixe).
Il faudrait le convertir: &(char *)tableau
Que fais-tu avec ce tableau pour que ça plante?
m
0
l
19 Décembre 2009 19:14:17

Je sais qu'en C un tableau est l'adresse qui pointe sur le premier élément du tableau.

si je fais ça :

fonction(tableau)
void fonction(char * tableau)

ça fonctionne effectivement (j'avais déjà essayé), ma question est d'ordre purement technique, pour comprendre pourquoi ça ne marche pas dans cette configuration là :

fonction(&tableau)
void fonction(char** tableau)

Si tableau est un pointeur de char, pourquoi l'adresse de ce tableau n'est pas un pointeur de pointeur de char?
Dans la première configuration le fait que mon tableau soit de taille fixe ne pose aucun problème pour le passage d'argument, alors pourquoi ça ne fonctionne pas dans la seconde configuration?


m
0
l
Contenus similaires
Pas de réponse à votre question ? Demandez !
a b L Programmation
19 Décembre 2009 19:48:55

ça doit fonctionner dans le second cas, c'est juste un warning parce que tu vas traiter un tableau de taille fixe comme un tableau de taille dynamique.
Il te faut changer le contenu de ta fonction parce que dans le premier cas tu as un pointeur sur le premier élément, et dans le second cas, tu a pointeur sur un pointeur sur le premier élément. donc, j'apellerai ça:
void fonction1(char** pTableau)
void fonction2(char* tableau)

Dans ces 2 fonctions, tableau == (*pTableau).
Si tu veux lire le 4ème caractère:
fonction1: (*pTableau)[3]
fonction2: tableau[3]
m
0
l
20 Décembre 2009 13:59:29

Donc finalement par un passage d'arguments classiques, on ne peut faire passer que des tableaux de taille dynamique si je comprends bien?
m
0
l
a b L Programmation
20 Décembre 2009 17:39:40

oui mais il faut savoir ce que tu fais sur le tableau (généralement on donne la taille dans un second paramètre).
m
0
l
21 Décembre 2009 00:19:50

Ok, c'est pas ce qu'on appelle le passage par descripteur?
m
0
l
a b L Programmation
21 Décembre 2009 21:37:39

Non, pour moi, le passage par descripteur est quelque chose de plus particulier à certains OS (comme OpenVMS). Dans ce cas, lors d'un appel système, au lieu de donner la chaine, on donnerait un descripteur, qui en fait est une structure de données contenant toutes les infos (pointeur, taille, type).
m
0
l
23 Décembre 2009 10:41:52

Merci pour toutes ces précisions CRicky. J'ai eu les réponses que je voulais.
m
0
l
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS