Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C argv=NULL意味着什么?_C - Fatal编程技术网

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中指针的顺序