在c中访问超出边界的数组
Accessing out of bound array in c
我见过一种特殊风格的代码,在我看来是危险的,应该避免,但我在很多地方都看到过很多次,我很困惑,是否我错过了什么。
int a[100];
/* Some code later */
for(i =0; (i < 100 && a[i] != 0); i++)
:
:
在上述代码中,表达式(i <100年,,A [i] = 0)从右到左求值,在这种情况下,当i == 100时,我们超出了数组' A '的边界。
谁能解释一下这是不是安全代码
-
&&
的求值顺序或参数顺序已经定义好了,不能更改。 -
#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相关文章:
- 在 64 位边界上对齐C++结构数组?
- std::数组边界检查如何工作?
- 在 c++ 中是否允许创建具有运行时边界的数组?
- SystemC sc_signal数组内存边界
- 在哪种情况下,C++会在编译时进行数组边界检查?
- 为什么当我在 CPP 的初始化中指定多维数组时,它必须有边界
- 访问边界外的数组元素会损坏它
- 分段错误发生在索引离开C++数组边界之后
- 使用 auto 时不检查数组边界
- 数组边界外的指针
- C++中"T 的未知边界数组"的外部声明
- 为什么 gcc 即使请求也不抱怨数组边界?
- C STL库矢量2D数组不超出边界
- 将索引超出数组边界在 C++ 中的内核之前抛出异常或错误
- C++ - 最快的检查数组边界
- 使用硬件内存保护对64位硬件进行数组边界检查
- 作为具有任意边界的类成员的多维数组
- 比较器获取C++中数组边界之外的索引
- 运行时边界数组的源级别检测有多困难
- c++(非C)中指向未指定边界数组的指针的可用情况