指针失去其值+ execv编译警告

我希望我没有错过类似的问题。

我正在尝试使用原始C函数编写自己的迷你shell。

我得到了一些应该可以工作的东西,但是我有一个指针可以解决所有问题。

我的adrCmd指针应该从searchCmd()函数获取命令路径字符串,并在main函数中保持相同的值。

实际上:它指向searchCmd()上的正确值,但不searchCmd() main()

这是代码:

  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; } 

这是执行返回的内容:

 $ ./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 

当我在这里时,当我编译时, execv返回一个警告:

 $ 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 *' 

我应该怎么做才能避免这种情况?

C是按值传递的。 这样做的时候

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

adrCmdadrCmd内容的副本。覆盖副本不会改变从调用者中复制的内容。

要修复此传递,请记下adrCmd的地址:

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

并像这样使用它:

  *padrCmd = adr; 

像这样调用searchCmd()

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

并像这样定义和初始化adrCmd ;

  char * adrCmd = NULL;