IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

"Segmentation fault" lorsque je passe un pointeur vers "**argv" en paramètre


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2022
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2022
    Messages : 21
    Par défaut "Segmentation fault" lorsque je passe un pointeur vers "**argv" en paramètre
    Bonjour tout le monde !

    D'abbord excusez moi si le titre n'est pas très clair, j'ai du coup écrit un mini code pour expliquer mon problème.

    J'essaie de faire passé un pointeur vers le "char** argv" du main en paramètre d'une autre fonction comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    #include <stdio.h>
     
    void print_args(int* argc, char*** argv)
    {
        for (int i = 0; i < *argc; i++)
        {
            printf("argv[%d] = %s\n", i, *argv[i]);
        }
    }
     
    int main(int argc, char** argv)
    {
        for (int i = 0; i < argc; i++)
        {
            printf("argv[%d] = %s\n", i, argv[i]);
        }
     
        printf("\nMaintenant la fonction:\n\n");
     
        print_args(&argc, &argv);
     
        return 0;
    }
    Mais en sortie je reçois ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    argv[0] = ./main
    argv[1] = hello
     
    Maintenant la fonction:
     
    argv[0] = ./main
    Segmentation fault (core dumped)
    Et je n'arrive pas à comprendre pourquoi, est-ce bien de faire comme ceci ? Est-ce moi qui ai mal compris quelque chose ?

    Voilà si quelqu'un pouvait me l'expliquer j'en serai vraiment reconnaissant car je n'arrive pas à trouver d'exemple sur internet qui essaie de faire pareil...

    Sur ce, merci d'avance ! ^^

    Edit: petites fautes de frappe et d'othographe, ohlala...

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par Bigfoot71 Voir le message
    Et je n'arrive pas à comprendre pourquoi, est-ce bien de faire comme ceci ?
    Bien? Pas forcément. On ne passe l'adresse d'une variable à une fonction que dans les cas suivants
    • la fonction doit modifier la variable de l'appelant. Ce n'est visiblement pas le cas ici.
    • la variable est super grosse (exemple une structure) donc vaut mieux passer une adresse de 4 octets qu'une structure de 4 milliards d'octets (n'oublions pas que les arguments passés sont recopiés dans les paramètres de la fonction). Mais là non plus ce n'est pas le cas.

    Donc entre passer argv (un pointeur) ou &argv (là aussi un pointeur) personnellement je resterais au plus simple. D'ailleurs autant passer un pointeur c'est (un peu) compréhensible avec argv, autant avec argc ça ne l'est plus du tout.

    Mais si c'est juste pour apprendre à manipuler les pointeurs, alors oui c'est bien.

    Citation Envoyé par Bigfoot71 Voir le message
    Est-ce moi qui ai mal compris quelque chose ?
    Tu as mal compris (ou pas pris en considération) les priorités des opérateurs. Ce n'est pas le pointé de argv[i] que tu veux afficher, c'est le pointé de "argv" ; décalé ensuite de "i" cases.

    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    #include <stdio.h>
     
    void print_args(int argc, char*** argv) {
    	for (int i = 0; i < argc; i++) {
    		printf("argv[%d] = %s\n", i, (*argv)[i]);
    	}
    }
     
    int main(int argc, char** argv) {
    	for (int i = 0; i < argc; i++) {
    		printf("argv[%d] = %s\n", i, argv[i]);
    	}
     
    	printf("\nMaintenant la fonction:\n\n");
     
    	print_args(argc, &argv);
     
    	return 0;
    }

    D'ailleurs de façon plus générale, chaque fois qu'une fonction reçoit une adresse et qu'elle doit travailler sur le pointé, on prend l'habitude de l'entourer systématiquement de parenthèses justement pour être certain de toujours coller l'étoile au pointeur et non pas à son expression finale. Si je veux incrémenter le pointé dans ma fonction, j'écrirai (*pt)++ et non pas *pt++.

    Citation Envoyé par Bigfoot71 Voir le message
    excusez moi si le titre n'est pas très clair, j'ai du coup écrit un mini code pour expliquer mon problème.
    Le titre est parfait. J'ai immédiatement pigé de quoi il s'agissait (enfin en gros) avant de venir voir, ce qui est le but d'un titre. Et c'est mieux que "problème C urgent SVP" comme on voit parfois (oui, on est sur un forum dédié à régler les soucis donc celui qui vient c'est qu'il a à priori un problème et ici c'est la partie C du forum). Mais même avec un titre correct, un code c'est super car ça permet de le copier pour le tester. Donc tout était nickel. Et les erreurs d'orthographe si au-moins on essaye de les éviter c'est pas trop grave.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2022
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2022
    Messages : 21
    Par défaut
    Merci beaucoup pour cette reponse rapide ! Et oui j'apprends justement à manier les pointeurs, j'ai bien compris qu'on les utilise pour modifier la variable pointée mais je suis tomber sur cette erreur en "bidouillant" et je n'arrivais pas à me l'expliquer, merci beaucoup j'ai enfin compris !

    Edit: et oui j'avoue, plutot absurde le pointeur sur argc, j'ai recopier à la main sans trop reflechir ni relire x)

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Bigfoot71 Voir le message
    Edit: et oui j'avoue, plutot absurde le pointeur sur argc, j'ai recopier à la main sans trop reflechir ni relire x)
    Là non plus ce n'est pas grave. Le même code avec un pointeur sur argc ça le fait aussi.
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    #include <stdio.h>
     
    void print_args(int *argc, char*** argv) {
    	for (int i = 0; i < (*argc); i++) {
    		printf("argv[%d] = %s\n", i, (*argv)[i]);
    	}
    }
     
    int main(int argc, char** argv) {
    	for (int i = 0; i < argc; i++) {
    		printf("argv[%d] = %s\n", i, argv[i]);
    	}
     
    	printf("\nMaintenant la fonction:\n\n");
     
    	print_args(&argc, &argv);
     
    	return 0;
    }

    Le souci, c'est qu'il ne faut pas tout d'un coup, parce qu'on a appris les pointeurs, se dire que c'est "la solution magique à tout".

    Un exemple: une fonction "carre()" qui retourne le carré d'un nombre. La première avec une simple variable et la seconde avec un pointeur...
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int carre_val(int n) {
    	return n*n;
    }
     
    int carre_pt(int *pt) {
    	return (*pt) * (*pt);
    }

    Ok, j'ai un nombre int x=123, l'un ou l'autre ça marchera
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int x=123;
    printf("Carré de 123: %d\n", carre_val(x));
    printf("Carré de 123: %d\n", carre_pt(&x));

    Mais si maintenant je veux calculer le carré de 18 (la valeur) !!!
    Avec la première, pas de souci printf("Carré de 18: %d\n", carre_val(18)). Mais comment faire avec la seconde ???!!!???

    Les pointeurs ce sont des outils. Ils seront parfait si tu arrives dans un cas où tu en as besoin (et bon, autant dire que des cas il y en aura). Mais si tu les utilises sans que ce soit nécessaire, tôt ou tard
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2022
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2022
    Messages : 21
    Par défaut
    Merci encore pour ce complément, ça va vraiment m'aider ! Et oui, j'ai vu que j'avais ce que j'attendais alors j'ai direct envoyé, MERCI !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Pb segmentation fault avec glutinit()
    Par pipistrelle dans le forum GLUT
    Réponses: 2
    Dernier message: 17/11/2004, 23h17
  2. [SDL_Image] Img_Load : segmentation fault ....
    Par Mathieu.J dans le forum OpenGL
    Réponses: 6
    Dernier message: 19/10/2004, 23h52
  3. [REDHAT] Segmentation fault systematique
    Par mela dans le forum RedHat / CentOS / Fedora
    Réponses: 2
    Dernier message: 21/09/2004, 06h05
  4. Réponses: 13
    Dernier message: 13/07/2004, 15h41
  5. Comment contrer la "segmentation fault" ?
    Par guillaume_pfr dans le forum C
    Réponses: 15
    Dernier message: 08/08/2003, 13h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo