Puntero que pierde su valor + advertencia de compilación execv

Espero no haberme perdido una pregunta similar.

Estoy tratando de codificar un mini-shell propio, usando funciones primitivas de C.

Tengo algo que debería funcionar, pero tengo un puntero que hace que todo funcione.

MiadrCmd el puntero debe obtener la cadena de ruta de comando delsearchCmd() funcionar y mantener el mismo valor en elmain función.

De hecho: apunta al valor correcto ensearchCmd(), pero no en elmain().

Aquí está el código:

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

Esto es lo que devuelve la ejecución:

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

Y mientras estoy aquí, cuando compilo,execv devuelve una advertencia:

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

¿Qué debo hacer para evitar esto?

Respuestas a la pregunta(1)

Su respuesta a la pregunta