argv 的双指针

Double pointer for argv

我正在尝试为一个新进程创建 argv(尝试使用 execvp),我查看了 execvp 手册页,上面说它需要 char *const argv[]。

我假设这是一个指向 char 指针数组的指针。那么是否可以将 char 的双指针传递给这个参数?

基本上,我要做的是如下 (argvcounter 是参数的数量。ex)cat a -> argvcount = 2)

int argvcount;
char **argv;
...
argv = malloc(sizeof(char*)*(argvcount+1));
for (int i = 0; i<argvcount; i++){
    argv[i] = some char pointer;
}
argv[-1] = NULL; 

我也不确定最后一行。我将最后一个元素设置为 NULL,因为参数数组的最后一个元素必须为 NULL。

是否可以将此 argv 传递给 execvp?

谢谢。

根据 C 标准(5.1.2.2.1 程序启动,第 #2 页)

— argv[argc] shall be a null pointer

所以你必须写

argv[argvcount] = NULL; 

此声明

argv[-1] = NULL; 

没有意义并导致未定义的行为。

I assume this is an pointer to array of char pointers. So is it possible to pass double pointer of char to this argument?

数组指示符在极少数情况下被隐式转换为指向其第一个元素的指针。

例如,如果您有这样的数组

char * argv[argvcount];

然后传递给一个函数,它被转换为指向其第一个元素的指针,类型为 char **

另一方面,这些函数声明

void f( char *a[] );

void f( char **a );

是等价的,因为编译器将声明为数组的参数类型调整为指向数组元素类型对象的指针类型。

it needs char *const argv[]. I assume this is an pointer to array of char pointers.

不,它是一个 char* const 指针数组。从右到左阅读这些声明可能会有所帮助:

  • [] 一个数组(大小未知)...
  • argv ...命名为 argv...
  • const ... const...
  • * ...指针...
  • char ...到字符。

用简单的英语来说:一个名为 argv 的数组(大小未知),包含 read-only 个指向字符的指针。

So is it possible to pass double pointer of char to this argument?

请注意参数和参数之间的细微差别。参数指的是函数声明中的变量,参数指的是你在调用方传递给函数的东西。这里很重要。

因为函数接受类型 char *const argv[] 的参数,编译器会将此参数 "adjusted" 默默地转换为指向第一个元素(有时称为 "array decay" )的指针。这就是为什么我们不必指定数组大小的原因 - 无论数组大小如何,它都会 "decay" 。

第一个元素是 char*const,指向该元素的指针是 char*const* 类型,因此这是函数所期望的类型。指向指向 char 的 const 指针的指针 - 在间接的第二层,指针本身不能被修改。

碰巧,char** 是一种可以隐式转换为 char*const* 的类型,因为后者是前者的 "qualified" 版本 - 它是同一类型但是"more const in the right places"。通常,任何type*都可以转换为type*const

如果参数是 const char* argv[],就不可能使用 char**,因为在那种情况下 const 属于 pointed-at 类型并且不是指针。


前面已经指出,注意argv[-1] = NULL;是废话,应该是argv[argvcount] = NULL;