超出索引C/C++
Out of index C/C++
C/C++中数组的典型声明是:
类型名称[元素];
其中type是有效的类型(如int、float…),name是有效的标识符,elements字段(总是用方括号[]括起来)根据元素数量指定数组的长度。
所以我声明一个int数组有两个元素
int a[2];
a[3] =4;
为什么不抛出异常?
越界检查是您可能已经习惯于Java等高级语言的检查。然而,在C/C++中,默认情况下不会这样做。检查数组的边界会给您带来很小的性能打击,因此C的基本原理是让您手动执行,以防您需要它来提供尽可能好的性能。像vector
这样的C++STL容器通常支持at()
操作来执行绑定检查,并且由于可以重载[]-运算符,因此还可以为数组样式访问启用绑定检查。
如果array
是一个原始指针,那么像array[i]
这样的语句在C/C++中可以归结为:
*(array + i)
这是地址+偏移量的简单相加。因此,以下陈述是等效的:
*(array + i), *(i + array), array[i], i[array]
内部发生的情况是,您获取存储在指针中的地址,将数组类型的大小增加i倍,然后取消引用该地址。
因此,如果指定的索引大于数组,则会访问不属于数组的内存。有效地读取了内存中数组旁边的随机数据。如果地址被写入,这是缓冲区溢出的典型来源。如果您试图访问的内存不属于您的进程,您将得到一个segfault。
'a'只是指向内存中(该数组)第一个元素的指针。有些编译器允许您访问内存的其他部分,而不会发出警告。有关阵列的正确使用,请参阅http://www.cplusplus.com/doc/tutorial/arrays/即使用类似的东西
#define MAX 5
int main(){
int a[MAX];
for(int i=0;i<MAX;i++){
a[i]=i;
}
}
相关文章:
- 数组索引的值没有增加
- 芬威克树(BIT).找到具有给定累积频率的最小索引,单位为 O(logN)
- 查找最接近的大于当前数字的数字的索引
- 在C++中调整向量中的索引
- 重载元组索引运算符-C++
- 给定一个向量,如何找到该向量的所有子集和的原始索引
- 为std::string的某个索引赋值
- 并行用于C++17中数组索引范围内的循环
- 跟随整数索引列表的自定义类迭代器
- 如何在for循环中包含两个索引值的测试条件
- D3D11-将混合权重和索引传递到顶点着色器
- 将转换字符键入 int 以用作向量C++的索引
- 在 C++ 中访问数组负索引处的内存不会返回垃圾
- 如何为圆环创建索引
- 在子集化后将包含索引号的列表列表映射到标准索引序列
- 查找字符在两个索引之间出现的次数
- Azure Kinect 使用正文索引映射裁剪正文
- 如何查找哪个类对象位于数组的特定索引上(多态性)
- 数组索引重载错误
- 如何在 std::vector 中找到<bool>哪些索引是真的?