实现shell:execvp()中的错误参数

时间:2013-09-26 17:23:02

标签: c linux shell pointers execvp

最近,我正在尝试在C上做好练习,现在我来执行命令。 它告诉我,我应该char**?但我有一些错误的概念。

请帮帮我。 代码在这里

int excution(int cnt, char token[][BUFSIZE],int *t_token)
{
    setenv ("PATH", "/bin:/bin/usr:", 1);
    //printf("%s",getenv("PATH")); // check environement
    const char *b_cd="cd";
    const char *b_exit="exit";
    const char *b_fg="fg";
    const char *b_jobs="jobs";
    int  i,j,k;
    //STEP 9:excute normal commanand
    char args[cnt][BUFSIZE];
    for(i=0;i<MAXARG;i++)
    {
        if(t_token[i]==COMMAND)
        {
            strcpy(args[0],token[i]); // copy 1st ARG
            j=1;
            while(t_token[i+1]==ARG)  
            {
                strcpy(args[j],token[i+1]);
                i++;
                j++;
            }
            for(k=0;k<j;k++)
            {
            printf("%s\n", args[k]);
            }
            execvp (args[0], args);
        }
    }

它在编译时给我警告。但如果我将2D数组更改为char** ....

,则会出现分段错误
  

警告:从不兼容的指针类型传递'execvp'的参数2   [默认启用] /usr/include/unistd.h:579:12:注意:预期   'char * const *'但参数的类型为'char(*)[256]'

1 个答案:

答案 0 :(得分:1)

也许我只是老了,但是当我看到 char var [X] [Y] 时,我认为编译器会分配一块< strong> sizeof(char)* X * Y 然后 var [i] 将等于 变种+(I * Y *(的sizeof(char)的)) 即可。只要每个人都知道X&amp;是啊,一切都很酷。但是 execvp() 并不知道你的X&amp; Y尺寸。

相比之下, char * var [X] 会给我一个X指针数组,每个 sizeof(char *) ,或 sizeof(char *)* X 的内存。

现在char通常是1个字节。 char * 通常为4或8个字节,但可能因系统而异。

所以 char * var [X] 可能是一大块内存 X * 8 字节大小和任何接收 var 作为参数的人都知道如何访问该数组中的每个 char * 指针作为指针大小是编译器所熟知的,它只是一个标准的偏移量。

另一方面,接收 char var [X] [Y] 的任何人都会感到非常困惑。没有办法告诉一个论点何处结束,另一个论点从那个巨大的记忆块开始。

长话短说:使用 char * args [SIZE]; ,使用 arg [i] =“command” < / strong>或 arg [i] = token [j] ,并了解指针。

P.S。 char ** 是指向char的指针。 (比方说,8个字节指向包含char(1字节)值的内存地址的8字节数据的另一个内存地址。当我们讨论将字符串存储为空终止时(char(更新) 0))字符数组 - 例如顺序存储的字符,所以如果我们知道字符串中第一个字符的地址,我们就可以增加指针以获得下一个字符,直到我们达到零,空字符'\ 0'。)

它与char的指针数组相似,但不完全相同。 (也就是说,8个字节指向一个包含至少8个字节数据的内存地址,也许是N * 8个字节的顺序内存地址(指针)。再次,就像顺序char数组一样,我们可以有一个数组 char * ,一个存储在内存中。)

更准确地说 char ** 大致等于 char * [N] ,只有 char ** 不会为内部 char * 指针分配任何内存,而< strong> char * [N] 可以 - 为N char * 指针分配空间。

当收到指向char的指针数组( char * [] )时,可以将其声明为指向char的指针( char ** )并仍然遍历数组。您只需要在指针指向的位置(传入)找到正确的底层内存块(数据)。