argv的双指针

时间:2019-06-17 08:49:31

标签: c arrays unix parameters startup

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

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

基本上,我想做的是如下 (argvcounter是参数个数。例如)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?

谢谢。

2 个答案:

答案 0 :(得分:1)

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

— argv[argc] shall be a null pointer

所以你必须写

argv[argvcount] = NULL; 

此声明

argv[-1] = NULL; 

没有意义,并导致不确定的行为。

  

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

具有罕见异常的数组设计器会隐式转换为指向其第一个元素的指针。

因此,例如,如果您有一个像这样的数组

char * argv[argvcount];

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

另一方面,这些函数声明

void f( char *a[] );

void f( char **a );

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

答案 1 :(得分:0)

  

它需要char *const argv[]。我认为这是一个指向char指针数组的指针。

否,它是char* const指针的数组。可能有助于从右到左阅读这些声明:

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

简而言之:一个名为argv的数组(大小未知),其中包含指向字符的只读指针。

  

那么可以将char的双指针传递给该参数吗?

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

因为一个函数接受类型为char *const argv[]的参数,编译器会将该参数静默“调整”为指向第一个元素的指针(有时称为“数组衰减”)。这就是为什么我们不必指定数组大小的原因-无论数组大小如何,它都会“衰减”。

第一个元素是char*const,指向该元素的指针的类型为char*const*,因此这是函数所期望的类型。指向char的const指针的指针-在第二个间接级别上,无法修改指针本身。

实际上,char**是一种可以隐式转换为char*const*的类型,因为后者是前者的“限定”版本-它是相同的类型,但带有“更多{ {1}}在正确的位置”。通常,任何const都可以转换为type*

如果参数为type*const,则不可能使用const char* argv[],因为在那种情况下,char**属于指向类型而不是指针。


正如已经指出的,请注意const是废话,应该是argv[-1] = NULL;