user-0 提问: argv[argc] = NULL，为什么这么设计？

回复:
user: user-1
content: 引用 23 楼 yangyunzhao 的回复:[quote=引用 4 楼 hhhhhhhhhhkkkkkkkkkk 的回复:] argv[argc] == NULL并不非法，c中一个字符串总以\0(就是NULL)结尾。argv[argc]就是最后一个字符NULL。这么设计的原因是方便循环等等。例如你想遍历字符串中的字符，可以这样写: for(int i=0;argv[i];i++){//做一些事} 与 for(int i=0;argv[i]==NULL;i++){//做一些事} 的效果一致。 argv不是字符数组，而是字符串数组。数组的元素是字符串！[/quote] 靠，没注意原来这是个字符串数组。我就说楼主怎么问这么基础的问题，感谢老兄提醒。不过我说的原因还是适用于这个，就是方便循环。

user: user-2
content: argv[argc]//this argument doesn`t exist in stack of function

user: user-0
content: 老大，别沉啊

user: user-3
content: 可以以指针的方式遍历argv，如果发现所指为NULL，表示所有的参数处理完了。

user: user-4
content: 引用 22 楼 a627088424 的回复:[quote=引用 19 楼 my_live_123 的回复:] 可以认为是一种安全机制吧，防止越界访问；也可能是方面代码的编写，而不局限于用argc限制数组大小 还真没有想过这个问题，c99也没有给出说明，只是提到此规则！不过一般的程序不用关心，对argv数组的设置有启动程序负责完成的，一般的用户只是使用这个数组 我就是突然“爱思考”了下，所以就跑了问问了，求大神赐教[/quote] 问倒喽，继续发扬此精神

user: user-5
content: 引用 4 楼 hhhhhhhhhhkkkkkkkkkk 的回复:argv[argc] == NULL并不非法，c中一个字符串总以\0(就是NULL)结尾。argv[argc]就是最后一个字符NULL。这么设计的原因是方便循环等等。例如你想遍历字符串中的字符，可以这样写: for(int i=0;argv[i];i++){//做一些事} 与 for(int i=0;argv[i]==NULL;i++){//做一些事} 的效果一致。 argv不是字符数组，而是字符串数组。数组的元素是字符串！

user: user-0
content: 引用 19 楼 my_live_123 的回复:可以认为是一种安全机制吧，防止越界访问；也可能是方面代码的编写，而不局限于用argc限制数组大小 还真没有想过这个问题，c99也没有给出说明，只是提到此规则！不过一般的程序不用关心，对argv数组的设置有启动程序负责完成的，一般的用户只是使用这个数组 我就是突然“爱思考”了下，所以就跑了问问了，求大神赐教

user: user-4
content: 可以认为是一种安全机制吧，防止越界访问；也可能是方面代码的编写，而不局限于用argc限制数组大小 还真没有想过这个问题，c99也没有给出说明，只是提到此规则！不过一般的程序不用关心，对argv数组的设置有启动程序负责完成的，一般的用户只是使用这个数组

user: user-6
content: 没用过这写法，貌似下标超范围了

user: user-0
content: 引用 16 楼 a627088424 的回复:[quote=引用 15 楼 a627088424 的回复:] [quote=引用 14 楼 paschen 的回复:] http://zhidao.baidu.com/link?url=RuxLmlrJAU8olHzwFhiMBJ5SG6dkcdQpBOyRvP7Z4EgNB0qtBFhmjqRxSgyup8GZ7HdnvZM3YuXFJwGm238c74CMFLIz0WjBjyLDqTOqs67  这个贴子可以使argc为0 他写的格式有点乱  其中execlp作用可以参见：http://baike.baidu.com/link?url=8LlIRn1qp8HvRVKWt4owK9pZBg0PUNcEiNsRcpiU2v8gwQ0QfyeObWHyHAEjvEM6ZxeC_NC4OpCekT0hXQ0Qz_ 我用gcc测试了那样会出错o  [/quote]  [/quote] 他那个帖子是因为他execlp执行错误，才会执行printf的，结果是1，

user: user-0
content: 引用 15 楼 a627088424 的回复:[quote=引用 14 楼 paschen 的回复:] http://zhidao.baidu.com/link?url=RuxLmlrJAU8olHzwFhiMBJ5SG6dkcdQpBOyRvP7Z4EgNB0qtBFhmjqRxSgyup8GZ7HdnvZM3YuXFJwGm238c74CMFLIz0WjBjyLDqTOqs67  这个贴子可以使argc为0 他写的格式有点乱  其中execlp作用可以参见：http://baike.baidu.com/link?url=8LlIRn1qp8HvRVKWt4owK9pZBg0PUNcEiNsRcpiU2v8gwQ0QfyeObWHyHAEjvEM6ZxeC_NC4OpCekT0hXQ0Qz_ 我用gcc测试了那样会出错o  [/quote]

user: user-0
content: 引用 14 楼 paschen 的回复:http://zhidao.baidu.com/link?url=RuxLmlrJAU8olHzwFhiMBJ5SG6dkcdQpBOyRvP7Z4EgNB0qtBFhmjqRxSgyup8GZ7HdnvZM3YuXFJwGm238c74CMFLIz0WjBjyLDqTOqs67  这个贴子可以使argc为0 他写的格式有点乱  其中execlp作用可以参见：http://baike.baidu.com/link?url=8LlIRn1qp8HvRVKWt4owK9pZBg0PUNcEiNsRcpiU2v8gwQ0QfyeObWHyHAEjvEM6ZxeC_NC4OpCekT0hXQ0Qz_ 我用gcc测试了那样会出错o

user: user-7
content: 弄起来真好玩。

user: user-8
content: http://zhidao.baidu.com/link?url=RuxLmlrJAU8olHzwFhiMBJ5SG6dkcdQpBOyRvP7Z4EgNB0qtBFhmjqRxSgyup8GZ7HdnvZM3YuXFJwGm238c74CMFLIz0WjBjyLDqTOqs67  这个贴子可以使argc为0 他写的格式有点乱  其中execlp作用可以参见：http://baike.baidu.com/link?url=8LlIRn1qp8HvRVKWt4owK9pZBg0PUNcEiNsRcpiU2v8gwQ0QfyeObWHyHAEjvEM6ZxeC_NC4OpCekT0hXQ0Qz_

user: user-9
content: 楼上说的不错，argc是main函数接受的参数个数，argv则是一个字符串数组 argv[argc]是非法的（但是argv[argc-1]）可以） 这样做的目的。。。个人觉得这样写是想把最后一个字符串设为NULL而防止访问错误，不过有argc在，所以没有必要这样做

user: user-0
content: 引用 1 楼 q3733353520 的回复:argc 为参数个数  argv为参数数组    对于一个数组  char a[10]; 能用 a[10] = 'a'吗？  (⊙o⊙)哦，我问题掉了个=号： argv[argc] == NULL，为何如此设计，有什么原因吗？

user: user-10
content: argc 为参数个数  argv为参数数组    对于一个数组  char a[10]; 能用 a[10] = 'a'吗？

user: user-0
content: 引用 12 楼 user-11 的回复:哦 找到原因了  因为 argc 可以是0 对于这种情况 argv[0] 总不能是一个野指针  argc 可以是0？ 真的？举个例子

user: user-11
content: 哦 找到原因了  因为 argc 可以是0 对于这种情况 argv[0] 总不能是一个野指针

user: user-0
content: 引用 10 楼 user-11 的回复:[quote=引用 9 楼 a627088424 的回复:] [quote=引用 7 楼 user-11 的回复:] [quote=引用 3 楼 wbx779139218 的回复:] 楼上说的不错，argc是main函数接受的参数个数，argv则是一个字符串数组 argv[argc]是非法的（但是argv[argc-1]）可以） 这样做的目的。。。个人觉得这样写是想把最后一个字符串设为NULL而防止访问错误，不过有argc在，所以没有必要这样做汗 不是非法的  argv[argc] shall be a null pointer. 标准文档里面是这样写的  题主问的是 为什么要这样规定[/quote] 嗯，有什么好的理由，还是历史遗留[/quote] 标示 argv什么时候结束的  虽然 argc 也有表示argv有多少个有效数据 但是 有时候 argc 的值会被修改  比如 -- argc  这时候 可以用argv[ i ] != NULL 来检查是不是有效传入参数[/quote] argc有被修改的可能性，难道argv[argc]就没有被修改的可能性吗？如果两个都被修改了，不就不知道有多少个参数了，除非最开始就用另外的一个新的变量保存个数