我正在尝试为新进程创建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?
谢谢。
答案 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;