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

ash*_*HUP 26 c string argv command-line-arguments

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

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

int main(int argc, char *argv[])
Run Code Online (Sandbox Code Playgroud)

cad*_*luk 26

根据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!

  • 这是否意味着指针本身可以修改?即可以这样做: `argv[0] = NULL ` (2认同)
  • @ 2501我问了一个[问题](http://stackoverflow.com/questions/35105918/are-the-pointers-to-strings-in-argv-modifiable),只是为了让你知道. (2认同)