在这个简单的3行程序中,c++关于数组的奇怪行为
Weird behavior of C++ in this simple 3 line program, regarding arrays?
为什么这个工作没有任何错误?
int array[2];
array[5] = 21;
cout << array[5];
它打印出21就可以了。但是看看这个!我把5改成了46,它仍然有效。但是当我输入47时,它没有打印任何东西。没有显示任何错误。这是怎么回事? ?
因为它只是未定义的行为(在c++中没有检查数组的边界)。一切皆有可能。
简单地说,array[5]
相当于*(&array[0] + 5)
,您试图将write/read
分配到内存中,而不是分配。
在C和c++语言中很少有运行时错误。
当你犯了一个错误,相反发生的是你得到"未定义的行为",这意味着任何事情都可能发生。你可以得到一个崩溃(即操作系统将停止进程,因为它正在做一些讨厌的事情),或者你可以只是破坏内存在你的程序,事情似乎无论如何工作,直到有人需要使用内存。不幸的是,第二种情况是迄今为止最常见的,所以当一个程序在数组外写入时,通常程序只会在随后执行的一百万条指令中崩溃,这是一个完全无害和正确的部分。
C和c++的主要哲学假设是程序员永远不会犯诸如访问索引越界的数组、释放两次相同的指针、在计算过程中产生有符号整数溢出、解引用空指针等错误。
这也是为什么仅仅使用编译器和通过编写代码来尝试学习C/c++是一个糟糕的主意的原因,因为你不会得到这种非常常见的错误的通知。
数组有2个元素,但是您正在分配array[5] = 21;
,这意味着21在数组外的内存中。根据您的系统和环境,array[46]
是一个有效的内存来保存数字,但array[47]
不是。
你应该这样做
int array[47];
array[47] = 21;
cout << array[47];
相关文章:
- 输出没有重复元素的动态数组(收缩数组)C++
- 将值从另一个数组写入数组,不包括不需要的值 C++
- 使用 GDAL 获取矢量数组中的所有行数和列数
- 将字符串转换为无符号字符数组/字节数组
- 如何有效地找到数组中三元组和的最小差异?
- 如何使用 ROS 从 yaml 文件中读取带有元组的数组?
- 对数组中子数组的引用
- C/C++中数组结构和数组结构的通用接口
- 如何在C 中创建类似于Python的Numpy数组的数组
- 将二进制操作员应用于数组中的每个元素
- 最小的正乘数,当应用于数组时,使数组成为积分
- 将函数应用于数组向量的元素
- 指向成员的指针的语法糖适用于数组,但不适用于 std::vector
- 将功能应用于数组中的每个元素
- 为什么数组的类型推断会将指向第一个的指针优先于对数组的引用
- 如何将函数应用于数组中的所有元素(在C++模板类中)
- 应用于数组的高阶函数
- 警告:数组下标高于数组边界 [-Warray-bounds]
- 实现[B,C]=f(A)语法(函数f作用于具有两个或多个输出数组的数组)
- STL容器相对于数组的速度