在c中访问超出边界的数组

Accessing out of bound array in c

本文关键字:边界 数组 访问      更新时间:2023-10-16

我见过一种特殊风格的代码,在我看来是危险的,应该避免,但我在很多地方都看到过很多次,我很困惑,是否我错过了什么。

int a[100];
/* Some code later */
for(i =0; (i < 100 && a[i] != 0); i++)
           :
           :

在上述代码中,表达式(i <100年,,A [i] = 0)从右到左求值,在这种情况下,当i == 100时,我们超出了数组' A '的边界。

谁能解释一下这是不是安全代码

  1. &&的求值顺序或参数顺序已经定义好了,不能更改。
  2. #1加上短路使其完全安全。

引用:

c++ 03标准:

第五节:表达式,第4段:

除非另有说明[例如 &&和||],单个操作符和单个表达式的子表达式的操作数的求值顺序以及副作用发生的顺序未指定。

C99标准:

6.5节:

操作符和操作数的分组由语法指示。72)除后面指定的(对于function-call()、&&、||、?:和逗号操作符)外,子表达式的求值顺序和副作用发生的顺序都未指定。

我认为当i < 100为假时,可以指望短路评估不访问a[i]

不可能从右到左计算(i < 100 && a[i] != 0)&&||被明确定义为先求左参数,必要时才求右参数。

"在上面的代码中,表达式(i <100年,,A [i] != 0)从右向左求值…"

不,这在C和c++中都是不可能的。在这两种语言中,这个表达式都保证从左到右求值。如果第一部分为假,则保证第二部分不被求值。

因此,代码对于越界访问是完全安全的。

&&和前面说的一样,从左到右求值。您可以考虑以下链接获取更多信息

http://en.cppreference.com/w/cpp/language/operator_precedence