1 votes

Passer des pointeurs à la fonction

J'ai un doute dans mon programme

#include<stdio.h>

int myFunc(char **);
main()
{
    char *a[2]={"Do","While"};
    myFunc(a);
}

int myFunc(char **P)
{
    /* Here I want to print the strings passed but I'm unable to
       print the strings I just tried the below statement which
       printed just the first letter which is 'D'*/
       printf("%c",**P);
}

quand j'ai essayé

printf("%s",**P);

J'obtiens une erreur d'exécution. Quelqu'un peut-il m'aider ?

Merci Madhu

1voto

Jimmy Points 7473

Le problème dans votre code est que vous voulez imprimer une chaîne (char*) mais vous lui donnez un char. Rappelez-vous que P est un tableau de char*. Lorsque vous le déréférencez une fois, vous obtenez un char* ; lorsque vous le faites une deuxième fois, vous obtenez simplement le char au début du char*.

Lorsque vous essayez d'utiliser la valeur char avec le spécificateur %s, il traite la valeur comme un pointeur et essaie de déréférencer cette valeur. Par conséquent, il essaiera d'imprimer la "chaîne" à l'emplacement mémoire X, où X est la valeur du caractère (c'est-à-dire une valeur comprise entre 0 et 255). Cela donne une violation d'accès/une erreur de segmentation (l'erreur que vous voyez au moment de l'exécution).

Les meilleures solutions de contournement de ce problème, comme l'a fait remarquer Cătălin Pitiș et RBerteig sont soit :

  • passer un autre paramètre pour spécifier la longueur du tableau
  • ajouter un null supplémentaire à la fin du tableau.

1voto

n-alexander Points 2685

Si vous ne voulez pas conserver et faire circuler le tableau size: :

int myFunc(char **);
main()
{
    char *a[2]={"Do","While", NULL};
    myFunc(a);
}

int myFunc(char **P)
{
    if( !P )
        return 0;
    while(*P != NULL)
    {
        printf("%s",*P);
        P++;
    }
}

0voto

mnuzzo Points 1497

Mauvaise réponse : Je pense que vous devez déréférencer P lorsque vous l'imprimez, mais je peux me tromper.

EDIT : Je suis fatigué, il est 3 heures du matin ici mais je n'ai pas envie de dormir donc je suis ici pour essayer de répondre aux questions. Après avoir lu la critique, j'ai relu la question et j'ai remarqué qu'il déréférence bien P, mais comme il est dit dans une autre réponse, il est déréférencé trop souvent. Quand on veut imprimer une chaîne de caractères, on veut passer un pointeur car la chaîne de caractères est en fait un tableau.

Autre EDIT : Je voudrais également signaler que la personne qui a posé la question a fait une modification après que j'ai répondu et que lorsque j'ai répondu pour la première fois, il n'était pas écrit "printf("%s",**P) ;" mais "printf("%s", P) ;" et la dernière partie était en gras.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X