0

最近,我正在尝试在 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]'</p>

4

1 回答 1

1

也许我只是老了,但是当我看到char var[X][Y]我认为编译器将分配一块sizeof(char)*X*Y的内存然后var[i]将等于var+(i*Y*(sizeof(char)))。只要每个人都知道 X 和 Y 是什么,一切都很酷。但execvp()不知道您的 X 和 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"arg[i] = token[j],并了解指针。

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

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

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

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

于 2013-09-26T18:26:48.050 回答