user-0 提问: argc和argv可以程序内赋值吗

回复:
user: user-0
content: 引用 4 楼 ArdoYe 的回复:不是const参数，可以修改的，只是改了以后就要自己小心维护，不要越界。  The parameters argc and argv and the strings pointed to by the argv array shall be modifiable by the program, and retain their last-stored values between program startup and program termination。  我的意思就是 int main(int argc, char** argv) {     argc = 2;     argv[1] = "aaa"; } 这种写法， 如果我只传一个参数进去，那argv[1] = "aaa" 这样不就出现数组越界了吗，  但是他前面又给argc赋值了2，这样是否确实地扩大了argv数组的空间

user: user-1
content: 不是const参数，可以修改的，只是改了以后就要自己小心维护，不要越界。  The parameters argc and argv and the strings pointed to by the argv array shall be modifiable by the program, and retain their last-stored values between program startup and program termination。

user: user-2
content: 只读，不可写~~~~

user: user-0
content: 引用 1 楼 Eleven 的回复:你已经始终把它们认为是只读~  是什么意思呢

user: user-2
content: 你已经始终把它们认为是只读~

user: user-0
content: 引用 14 楼 lin5161678 的回复:[quote=引用 13 楼 jSORoROWy 的回复:] [quote=引用 9 楼 lin5161678 的回复:] 可以修改 注意不要越界就好了  包括argv本身和argv[ i ] 2个维度的不能越界   标准中的main第二个参数不带 const 就算你这个带上const的参数 一样可以修改 argv[i] 和 argv 不能修改的只是 argv[i][j]  也就是说如果我运行时候输入3个参数，我可以改argv[0], argv[1], argv[2], 而argv[3]以及之后若进行赋值肯定是越界  但是IOS/IEC 9899 5.1.2.2.1中有提到 引用http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf The parameters argc and argv and the strings pointed to by the argv array shall be modifiable by the program, and retain their last-stored values between program startup and program termination 说argc和argv都应可修改，那么如果argc的修改并不能使得argv的大小改变，那修改该argc的意义是什么[/quote] 假设你输入参数是  程序名 参数1 参数2 你可以修改  argv[0] argv[1] argv[2] argv[3] argv[4]开始包括4 是越界  argc和argv都可修改 argc的修改并不能使得argv的大小改变 修改该argc的意义 就是修改argc [/quote]  好的，感谢！！！

user: user-0
content: 抱歉，上面说错，是输入2个参数

user: user-3
content: 引用 13 楼 jSORoROWy 的回复:[quote=引用 9 楼 lin5161678 的回复:] 可以修改 注意不要越界就好了  包括argv本身和argv[ i ] 2个维度的不能越界   标准中的main第二个参数不带 const 就算你这个带上const的参数 一样可以修改 argv[i] 和 argv 不能修改的只是 argv[i][j]  也就是说如果我运行时候输入3个参数，我可以改argv[0], argv[1], argv[2], 而argv[3]以及之后若进行赋值肯定是越界  但是IOS/IEC 9899 5.1.2.2.1中有提到 引用http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf The parameters argc and argv and the strings pointed to by the argv array shall be modifiable by the program, and retain their last-stored values between program startup and program termination 说argc和argv都应可修改，那么如果argc的修改并不能使得argv的大小改变，那修改该argc的意义是什么[/quote] 假设你输入参数是  程序名 参数1 参数2 你可以修改  argv[0] argv[1] argv[2] argv[3] argv[4]开始包括4 是越界  argc和argv都可修改 argc的修改并不能使得argv的大小改变 修改该argc的意义 就是修改argc

user: user-0
content: 引用 9 楼 lin5161678 的回复:可以修改 注意不要越界就好了  包括argv本身和argv[ i ] 2个维度的不能越界   标准中的main第二个参数不带 const 就算你这个带上const的参数 一样可以修改 argv[i] 和 argv 不能修改的只是 argv[i][j]  也就是说如果我运行时候输入3个参数，我可以改argv[0], argv[1], argv[2], 而argv[3]以及之后若进行赋值肯定是越界  但是IOS/IEC 9899 5.1.2.2.1中有提到 引用http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf The parameters argc and argv and the strings pointed to by the argv array shall be modifiable by the program, and retain their last-stored values between program startup and program termination 说argc和argv都应可修改，那么如果argc的修改并不能使得argv的大小改变，那修改该argc的意义是什么

user: user-4
content: 这个得关注一下，以前没有想过可以这样用

user: user-3
content: 引用 10 楼 jSORoROWy 的回复:[quote=引用 8 楼 自信男孩 的回复:] 建议理解一下main函数的两个参数的作用，第一个参数是值执行是的参数个数，第二个参数参数的内容。 对于main函数来讲，这两个参数的作用是接收在运行终端上输入的参数，因此不能在main中对他们进行修改；  int main(int argc, const char *argv[]) 这是main函数的两个参数，从第二个参数可知，argv[]是不允许修改的  如果是int main(int argc, char* argv[]) 不就可以修改了吗，实际上修改了也不会有问题（在简单程序中我没有发现修改argv会造成什么影响，甚至数组越界访问也可以（就是我一楼的那种写法））  int main(int argc, char* argv[]) {     argc = 2;     argv[1] = "aaa";     printf("%s", argv[1]);     return 0; }  以上代码编译运行结果： aaa  如果argc的改变底层不会自动使argv扩容，那么argv[1]肯定是越界访问了，关键是c不检查越界，所以我无法知道到底有没有越界[/quote]需要注意2点  1. 你一楼的做法并没有越界  argv末尾有一个NULL 你修改了那个指针而已 并没有越界 2. 没有统一有效的方式说明存在越界行为 不是说能运行就没越界  另外 明确告诉你 修改argc不存在argv扩容 只是简简单单的修改一个变量而已  这种东西没什么神秘的 直接看汇编就是一个mov 完事

user: user-0
content: 引用 8 楼 自信男孩 的回复:建议理解一下main函数的两个参数的作用，第一个参数是值执行是的参数个数，第二个参数参数的内容。 对于main函数来讲，这两个参数的作用是接收在运行终端上输入的参数，因此不能在main中对他们进行修改；  int main(int argc, const char *argv[]) 这是main函数的两个参数，从第二个参数可知，argv[]是不允许修改的  如果是int main(int argc, char* argv[]) 不就可以修改了吗，实际上修改了也不会有问题（在简单程序中我没有发现修改argv会造成什么影响，甚至数组越界访问也可以（就是我一楼的那种写法））  int main(int argc, char* argv[]) {     argc = 2;     argv[1] = "aaa";     printf("%s", argv[1]);     return 0; }  以上代码编译运行结果： aaa  如果argc的改变底层不会自动使argv扩容，那么argv[1]肯定是越界访问了，关键是c不检查越界，所以我无法知道到底有没有越界

user: user-3
content: 引用 8 楼 自信男孩 的回复:建议理解一下main函数的两个参数的作用，第一个参数是值执行是的参数个数，第二个参数参数的内容。 对于main函数来讲，这两个参数的作用是接收在运行终端上输入的参数，因此不能在main中对他们进行修改；  int main(int argc, const char *argv[]) 这是main函数的两个参数，从第二个参数可知，argv[]是不允许修改的可以修改 注意不要越界就好了  包括argv本身和argv[ i ] 2个维度的不能越界   标准中的main第二个参数不带 const 就算你这个带上const的参数 一样可以修改 argv[i] 和 argv 不能修改的只是 argv[i][j]

user: user-5
content: 建议理解一下main函数的两个参数的作用，第一个参数是值执行是的参数个数，第二个参数参数的内容。 对于main函数来讲，这两个参数的作用是接收在运行终端上输入的参数，因此不能在main中对他们进行修改；  int main(int argc, const char *argv[]) 这是main函数的两个参数，从第二个参数可知，argv[]是不允许修改的

user: user-6
content: 引用 5 楼 jSORoROWy 的回复:[quote=引用 4 楼 ArdoYe 的回复:] 不是const参数，可以修改的，只是改了以后就要自己小心维护，不要越界。  The parameters argc and argv and the strings pointed to by the argv array shall be modifiable by the program, and retain their last-stored values between program startup and program termination。  我的意思就是 int main(int argc, char** argv) {     argc = 2;     argv[1] = "aaa"; } 这种写法， 如果我只传一个参数进去，那argv[1] = "aaa" 这样不就出现数组越界了吗，  但是他前面又给argc赋值了2，这样是否确实地扩大了argv数组的空间[/quote] 怎么可能因为给argc赋值为2，就扩大数组空间。要扩展数组空间，需要调用realloc。类似 argv = (char **)realloc(argv, argc);  另外，一般来说，我们不会修改argc和argv，因为有类似GetCommandLine的函数，可以获取到参数的。楼主自己加的，还真不确定能不能拿到哦。

user: user-0
content: 自顶一下。。