达到极限时* argv ++和* argv--之间的区别

时间:2013-04-15 19:15:03

标签: c

有人可以解释原因吗

int main(int argc, const char * argv[]) {
  while (* argv) 
    puts(* argv++);
  return 0 ;
}

是合法的,

int main(int argc, const char * argv[]) {
  argv += argc - 1;
  while (* argv) 
    puts(* argv--);
  return 0 ;
}

是不? 在这两种情况下,while循环中的'crement将指向argv的边界之外。为什么指向虚构的较高指数是合法的,而不是假想的较低指数?

最好的问候。

4 个答案:

答案 0 :(得分:1)

因为C标准说你可以形成一个指向数组末尾的指针,它仍然可以正确地与指向数组的指针进行比较(尽管你不能取消引用它)。

标准没有说明在数组开始之前指向地址的指针的任何类型 - 即使形成这样的指针也会产生未定义的行为。

答案 1 :(得分:0)

循环语义和半开区间。迭代指针指向的数组或对象列表的惯用方法是:

for (T *p = array; p < array + count; p++)

在这里,p最终超出范围(一个关闭,指向一个超过数组的末尾),所以它(不仅在概念上)有用,要求不要调用未定义的行为(标准实际上强加了这个要求)。

答案 2 :(得分:0)

标准强制argv[argc]等于NULL,因此当argv增加argc次时解除引用argv是合法的。

另一方面,没有对argv之前的地址进行任何定义,因此argv - 1可以是任何内容。

请注意,就我所知,argv是唯一保证以这种方式运行的字符串数组。

来自标准:

5.1.2.2.1程序启动

  

如果声明它们,主函数的参数应遵循以下成本:

     

argv [argc]应为空指针

答案 3 :(得分:0)

argv++++argv因为它是const指针。

如果您选择char* arr[10]之类的简单数组并尝试arr++则会出错