有人可以解释原因吗
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的边界之外。为什么指向虚构的较高指数是合法的,而不是假想的较低指数?
最好的问候。
答案 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++
则会出错