最近,我正在尝试在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]'
答案 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 ** )并仍然遍历数组。您只需要在指针指向的位置(传入)找到正确的底层内存块(数据)。