0 votes

Pourquoi le programme swap qui collecte les adresses dans les pointeurs vers les pointeurs n'a pas fonctionné ?

J'ai un programme ci-dessous

void swap(char **s1,char **s2);

int main()
{
 char *list[] = {
       "Das",
       "Kannan",
       "Rajendran",
       "Shahul"
 };   

 printf("Before swap list[0] = %s,list[1] = %s\n",*list[0],*list[1]);

 swap(&list[0],&list[1]);

 printf("After swap list[0] = %s,list[1] = %s\n",*list[0],*list[1]);

 return 0;

}

void swap(char **s1,char **s2)
{
 char *t;

 t = *s1;
 *s1 = *s2;
 *s2 = t;
}

J'essaie de permuter les adresses de la liste[0] et de la liste[1].

Visual Studio 2008 génère une erreur lors de l'exécution (démarrage du débogage) de ce programme. L'erreur générée est

Exception non gérée à 0x1029984f (msvcr90d.dll) dans ConsoleApp.exe : 0xC0000005 : Violation d'accès à la lecture de l'emplacement 0x00000044.

Aucune erreur de compilation.

Puis-je savoir pourquoi l'utilisation de pointeur à pointeur ne fonctionne pas correctement ? A void swap(char *s1,char *s2) n'a pas non plus fonctionné.

3voto

John Kugelman Points 108754

Visual Studio 2008 génère une erreur lors de l'exécution de ce programme (Start debugging).

Vos impressions sont défectueuses. Enlevez les astérisques :

printf("Before swap list[0] = %s,list[1] = %s\n",list[0],list[1]);

swap(&list[0],&list[1]);

printf("After swap list[0] = %s,list[1] = %s\n",list[0],list[1]);

Pourquoi ? Et bien, list[0] est la chaîne de caractères "Das" qui a le type char * . C'est ce que vous voulez passer à printf. Si vous déréférencez ce pointeur avec un astérisque, vous finirez par passer le premier caractère 'D' à printf, où printf s'attend à un char * ficelle. Il finit par essayer de traiter le caractère 'D' comme un pointeur. La valeur ASCII de 'D' est 68, ou 0x44 en hexagone, ce qui explique le message d'erreur que vous avez obtenu.

Je voudrais également savoir pourquoi void swap(char *s1,char *s2) n'a pas fonctionné non plus.

Avec cette fonction, vous seriez en mesure d'intervertir les caractères de deux chaînes de caractères, mais vous ne pourriez pas intervertir les chaînes de caractères elles-mêmes. Imaginez que la fonction d'échange nécessite des pointeurs vers les objets à échanger. Si vous échangez deux nombres entiers, vous aurez besoin des éléments suivants swap(int *i1, int *i2) . Vous voulez échanger deux chaînes de caractères de type char * ce qui signifie que la fonction d'échange nécessite deux étoiles : swap(char **s1, char **s2) . Est-ce que cela a un sens ?

0voto

R Samuel Klatchko Points 44549

Le problème se trouve dans votre instruction printf. Vous déréférencez votre pointeur de chaîne. Changez votre printf de :

printf("Before swap list[0] = %s,list[1] = %s\n",*list[0],*list[1]);

à :

printf("Before swap list[0] = %s,list[1] = %s\n",list[0],list[1]);

(ainsi que l'après échange) et tout ira bien.

0voto

Brian Campbell Points 101107
printf("Before swap list[0] = %s,list[1] = %s\n",*list[0],*list[1]);
swap(&list[0],&list[1]);
printf("After swap list[0] = %s,list[1] = %s\n",*list[0],*list[1]);

Il n'est pas nécessaire de déréférencer ces éléments. char * ici. Au lieu de cela, vous devriez le faire :

printf("Before swap list[0] = %s,list[1] = %s\n",list[0],list[1]);
swap(&list[0],&list[1]);
printf("After swap list[0] = %s,list[1] = %s\n",list[0],list[1]);

Votre list Le tableau contient char * où les éléments char * sont des pointeurs vers des chaînes de caractères C (séquences de caractères à terminaison nulle). En déréférençant ces éléments, vous transmettez en fait le premier caractère de chaque chaîne à la fonction printf au lieu de la chaîne elle-même. Lorsque printf essaie lui-même de déréférencer cette valeur de caractère, il tente d'accéder à un segment de mémoire non valide, ce qui entraîne une erreur de segmentation.

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