繁体   English   中英

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

[英]Implementing a shell: wrong argument in 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]'

也许我才刚刚老,但是当我看到char var [X] [Y]时,我认为编译器将分配一块大小sizeof(char)* X * Y的内存,然后var [i]将等于var +(i * Y *(sizeof(char))) 只要每个人都知道X&Y是什么,一切都很酷。 但是execvp()不知道您的X和Y大小。

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

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

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

另一方面,任何收到char var [X] [Y]的人都会很困惑。 没有办法告诉一个参数在那巨大的内存块中何处结束而另一个在何处开始。

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

ps char **是指向char的指针。 (也就是说,这8个字节指向另一个包含8个字节数据的存储地址,其中该数据包含一个char(1个字节)值的存储地址。当我们谈论将字符串存储为以null终止(char( 0))字符数组-例如,顺序存储的字符,因此,如果我们知道字符串中第一个字符的地址,则可以递增指针以获取下一个字符,直到我们击零为止,即为零字符'\\ 0'。)

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

char **大致等于char * [N]会更准确,只有char **不会为内部char *指针分配任何内存,而char * [N]会分配-内部空间用于N个char *指针。

当接收到一个指向char( char * [] )的指针数组时,可以将其声明为指向char( char ** )指针的指针,并且仍然迭代该数组。 您只需要在指针指向的位置定位(传递)正确的基础内存块(数据)即可。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM