argv中的字符串是否可修改?

我刚刚写了一个小程序,用C语言读取命令行参数,没什么太难的。 我也在修改它们,例如将参数的第一个字符更改为大写。

我知道你不应该修改字符串文字,因为它可能导致未定义的行为,所以只是想知道*argv[]中的字符串是否是你不应该更改的文字。

 int main(int argc, char *argv[]) 

根据C11标准草案N1570,§5.1.2.2.1/ 2:

参数argcargv以及argv数组指向的字符串应由程序修改,并在程序启动和程序终止之间保留它们最后存储的值。

它们是可以修改的。 这意味着它们不是字符串文字。

要小心 :上面引用只引用指向字符串的指针,不包括argv[argc] 1中的强制空指针。
根据C11标准草案N1570,§5.1.2.2.1/ 2(与上述相同) 1

argv[argc]应为空指针


笔记:

  • 关于这句话的事情:

    我知道你不应该修改字符串文字,因为它可能会导致未定义的行为[…]

    “能够”? 它总是如此。 未定义的行为包括预期的,好像定义明确的和意外的行为。


1感谢@black!

 int main(int argc, char *argv[]) 

argvchar的指针数组( 右边的规则 )。 但是在函数参数中指定的数组被视为指向数组元素类型的指针,因此可以说它是指向char的指针。 所以根据main的签名你可以修改它。 否则它必须是指向constant char指针。

同样根据定义 ,它不是字符串文字。

支持argv中的字符串的数组是可修改的。
但是你无法知道它们的尺寸。

我会看到(试图)增加字符串大小的代码。

 #include  #include  // this program may behave erraticaly int main(int argc, char **argv) { for (int k = 1; k < argc; k++) { printf("original argv[%d] is %s\n", k, argv[k]); } printf("\n"); for (int k = 1; k < argc; k++) { strcat(argv[k], " foo"); // add foo to each argv string printf("first modification to argv[%d] is %s\n", k, argv[k]); } printf("\n"); for (int k = argc; k > 1; k--) { strcat(argv[k - 1], " bar"); // add bar to each argv string printf("final argv[%d] is %s\n", k - 1, argv[k - 1]); } return 0; } 

在我的机器上,用one two three参数调用该程序

原始argv [1]是一个
原来的argv [2]是两个
原来的argv [3]是三个

对argv [1]的第一次修改是一个foo
 argv [2]的第一个修改是foo foo
对argv [3]的第一次修改是foo foo

最终的argv [3]是foo foo吧
 final argv [2]是foo foo foo吧吧
 final argv [1]是一个foo foo foo bar bar bar吧