在C标准ISO / IEC 9899:2018(C18)中,第§5.1.2.2.1-“程序启动”中写道:
2-如果声明了它们,则主函数的参数应遵循以下约束:
— argv [argc]应为空指针。
我的问题是:
char *argv[argc]
/ char **argv
应该是/是指向NULL
的指针? 这对我来说毫无意义。 argv[]
是指向char
的指针的数组。 argv
是指向char
的指针数组的指针。即使该调用没有给出任何标志,该指针也不应转向指向NULL
的指针。
char* argv[]
不是指向char
的指针的数组,还是char **argv
是指向char
的指针的嵌套指针? char
(char**
)的嵌套指针如何成为NULL
的指针?
[我已经阅读了argv[argc] ==?的答案,其中引用了上述标准中的短语作为答案,还质疑了@pmg´s answer,后者给了我答案:
与所用名称无关,由c规范char * argv [argc]声明了一个名为argv的数组,该数组能够保存指向char的argc指针。当传递给函数时,数组将转换为指向其第一个元素的指针(因此,指向char的指针[这就是为什么通常看到main(int argc,char ** argv)])丢失有关大小的信息的原因(char * a [10]有10个元素; char ** a是一个指针---如果指针指向一个数组,则无法知道底层数组有多少个元素)。
但是遗憾的是,尽管付出了辛勤的努力,但我仍然不明白为什么指向
char
(char**
)的指针(嵌套指针)的指针变成了NULL
的指针。
Is argv[argc] equal to NULL Pointer的答案也没有回答为什么
它应该是指向NULL
的指针,只有是是指向NULL
的指针,同时引用上述标准的说明。] >提前感谢。
在C标准ISO / IEC 9899:2018(C18)中,第§5.1.2.2.1-“程序启动”中写道:2-如果声明了它们,则主要功能的参数应遵循以下约束: — ...
发件人
国际标准程序设计语言规范C修订5.102003年4月
完成的原因有两个:
为了提高安全性:如果尝试访问[argc - 1]
以外的元素,则会崩溃,而不是将垃圾解释为额外的参数并对其进行不良处理,例如将其视为文件名并写入文件。
什么意思
— argv [argc]应为空指针。
IMO是为了方便while(*argv != NULL) ....