C argv=NULL意味着什么?
我试图使论点信息可修改C argv=NULL意味着什么?,c,C,我试图使论点信息可修改 #include <stdio.h> #include <stdlib.h> int main(const int argc, const char* const argv[]) { //argc = 1; // error: assignment of read-only parameter 'argc' //argv[0] = "argv"; // error: assignment of read-only loca
#include <stdio.h>
#include <stdlib.h>
int main(const int argc, const char* const argv[]) {
//argc = 1; // error: assignment of read-only parameter 'argc'
//argv[0] = "argv"; // error: assignment of read-only location '*argv'
//argv[0][0] = 'a'; // error: assignment of read-only location '**argv'
return EXIT_SUCCESS;
}
编译器保持沉默
这句话实际上是做什么的?
如何禁止代码执行此操作?您可以将
const
放在数组指针参数的括号中,以防止重新分配给它:
int main(const int argc, const char* const argv[const]) {
int main(常量int argc,常量char*const argv[const]){
人们通常不会为此烦恼。因为这个答案被固定在顶部,我觉得我应该指出我的答案只解决了问题的一部分。请参阅为什么不以这种方式声明
main
如果使用数组类型声明参数,则该类型将隐式替换为指针类型:
int main(const int argc, const char* const argv[]) {
变成
int main(const int argc, const char* const *argv) {
因此,argv
是指向常量字符的非常量指针
argv=NULL
只需将该指针设置为NULL指针,就像将NULL指定给任何其他指针一样。这不会产生任何直接可见的外部效果-不会擦除命令行或任何内容-但会干扰从程序中进一步使用参数信息的尝试
如果希望argv
本身为常量,请将其声明为常量:
int main(const int argc, const char * const * const argv) {
嗯,首先,不要这样做 我参考了现有的答案,了解如何使用它,它们解释了可以应用的不同级别
const
,以及如何将其写入和写入。知道这些肯定很好
但是它来了:main
非常特殊。根据C标准,它没有原型,但定义应该只采用两种形式中的一种。以下是原文,从最新的草稿到C11:
§5.1.2.2.1:
程序启动时调用的函数名为main
此函数的原型。应使用返回类型int
进行定义,且无
参数:int main(void){/*…*/}
或具有两个参数(此处称为
argc
和argv
),但任何名称都可以是
已使用,因为它们在声明它们的函数中是本地的):intmain(intargc,char*argv[]){/*…*/}
或同等标准;10)或以其他实施定义的方式 脚注10甚至解释了此处的等效含义: 因此,
int
可以被定义为int
的typedef名称替换,或者argv
的类型可以写成
char**argv
,依此类推
但是,关于添加一些常数
s,请参见§6.7.6.1 p2中的示例:
对于要兼容的两种指针类型,两种指针都应具有相同的合格性,并且都应
成为指向兼容类型的指针
(强调矿山).const
是一个类型限定符。因此const char**
与char**
不兼容。您定义的main
不再符合C标准。因此,不要这样做。在程序内部使用const
正确性,但不要尝试更改程序的接口装饰
旁注:正是您在这里询问的一个
常量可能是可以的,因为它适用于指针本身,而指针本身只是函数的局部变量(因为在C函数调用中参数总是按值)。因此它不会更改函数的接口。这就是为什么在实践中,没有人愿意添加这样的const
s。函数是否修改其局部变量对于调用代码并不重要。参数已经是不可修改的。。它们是使用argv
和argc
i从命令行传递到应用程序的指示传递的数字。除了停止编写尝试这样做的代码外,不必做任何事情使其不可修改。注意,如果停止编写类似于argv=
的代码,则不会有任何问题。@KenWhite“参数已经不可修改”,这是错误的,您可以更改它。您有答案,但他们没有答案。这不是一个好主意。C标准只描述了main的两种有效形式:int main(void)
和int main(int argc,char*argv[])
int main(int argc,char**argv)
是100%等效的,因为类型调整规则,所以也可以,但是如果你开始添加常量,它是一个不同的签名。C的实现可以支持它们自己定义的其他形式的主代码,但是你的程序不再符合标准C,其他编译器可能会拒绝它。@FelixPalmen我从来没有这样做过r知道。输入const
s会产生不同的签名是真的吗?谢谢。所有的反对票是怎么回事?这是个好问题?我仍然不知道他们为什么要输入这种语法。没有它,C的声明语法已经够混乱的了,据我所知,它不会添加新的功能或使任何事情变得更简单。@user2357112:如果你想同时使用const
和[static n]
,我认为它必须可用。如果你像许多程序一样使用:parse_my_options(&argc,&argv)
。而且,我相信我读到了正确定义的地方:int main(int argc,char**argv)
或int main(void)
或int main(int argc、char**argv、char**envp)
。其他方法也可以,但它们不被认为是惯用的。请参阅:@CraigEstey:无助于如何使用?您可以从&argv
@CraigEstey获得常量指针。这与惯用无关,标准只说任何其他main定义都将被实现。但确实,主参数没有理由是const
,因为我们经常使用它们来处理选项。如中所示,此函数更改*arg中指针的顺序