Pointeur perdant sa valeur + avertissement de compilation execv

J’espère que je n’ai pas manqué une question similaire.

J’essaie de coder mon propre mini-shell à l’aide de fonctions C primitives.

J’ai quelque chose qui devrait fonctionner, mais j’ai un pointeur qui rend tout bogue.

Mon pointeur adrCmd doit obtenir la chaîne de chemin de commande de la fonction searchCmd() et conserver la même valeur dans la fonction main .

En fait: cela pointe vers la bonne valeur sur searchCmd() , mais pas dans la main() .

Voici le code:

  int searchCmd(char* cmd, char* adrCmd){ char* path = getenv("PATH"); if(debug)printf("PATH : %s\n", path); int nbPath = (compteLettre(path, ':')+1); char** pathTab = malloc(nbPath*sizeof(char*)); decompose(path, pathTab, 2048, ':'); int i; char* adr = malloc(sizeof(char*)); for(i=0; i<nbPath; i++){ sprintf(adr, "%s/%s", pathTab[i], cmd); if(debug)printf(" source : %s \n", adr); int fs = open(adr, O_RDONLY); // Si on peut ouvrir le fichier, c'est qu'il existe ! if(fs != -1){ // si le fichier existe, on le renvoie; if(debug){ printf("Commande trouvée dans path ! \n"); printf("%s \n", adr); } adrCmd = adr; printf("%s ?= %s \n",adrCmd, adr );// oui return 1; } } return 0; } /**********************\ Main \**********************/ int main(int argc, char** argv){ printf("Mini-shell : OK \n"); char cmd[CMDSIZE]; char** splited = malloc(CMDSIZE*sizeof(char*)); char* adrCmd = malloc(sizeof(char*)); char* params; while(printf("$ : ") && gets(cmd) && (strcmp(cmd, "exit")!=0 && strcmp(cmd, "quit")!=0)){ // On boucle tant que la commande != "exit" ou "quit" printf("Votre commande : %s \n", cmd); decompose(cmd, splited, CMDSIZE, ' '); if(debug)afficheCmd(splited, CMDSIZE); if(!searchCmd(splited[0], adrCmd)){ printf("Commande n'existe pas, essayez apt-get install %s\n", splited[0]); }else{ if(debug)printf("Execution de la commande '%s' : \n", adrCmd); params = splited[1]; // params = array(splited[1], splited[2], ...... ) if(execv(adrCmd, params) == -1){ printf("Erreur d'exection de la commande\n"); } } } printf("Fin du programme %s \n", argv[0]); return 0; } 

Voici ce que l’exécution renvoie:

 $ ./a.out Mini-shell : OK $ : ls /var Votre commande : ls /var CMD[0] = ls CMD[1] = /var PATH : /usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games source : /usr/lib/lightdm/lightdm/ls source : /usr/local/sbin/ls source : /usr/local/bin/ls source : /usr/sbin/ls source : /usr/bin/ls source : /sbin/ls source : /bin/ls Commande trouvée dans path ! /bin/ls /bin/ls ?= /bin/ls Execution de la commande '' : Erreur d'exection de la commande 

Et pendant que je suis ici, lors de la compilation, execv renvoie un avertissement:

 $ gcc shell.c shell.c: In function 'main': shell.c:113:4: attention : passing argument 2 of 'execv' from incompatible pointer type [enabled by default] /usr/include/unistd.h:564:12: note: expected 'char * const*' but argument is of type 'char *' 

Que dois-je faire pour éviter cela?

    C est passe par valeur. Alors, quand tu fais ça

      int searchCmd(char * cmd, char * adrCmd){ 

    adrCmd est une copie de ce qui a été transmis. Le remplacement de la copie ne changera pas ce qui a été copié dans l’appelant.

    Pour résoudre ce problème, transmettez l’adresse de adrCmd :

      int searchCmd(char * cmd, char ** padrCmd){ 

    et l’utiliser comme ça:

      *padrCmd = adr; 

    Appelez searchCmd() comme ceci:

      if(!searchCmd(splited[0], &adrCmd)){ 

    et définir et initialiser adrCmd comme ceci;

      char * adrCmd = NULL;