arrays - 程序应该崩溃,但它没有
问题描述
#include <stdio.h>
#define CHAR_ROW_SIZE 4
int charTable[CHAR_ROW_SIZE ][2] = {
{'X', 'Z'},
{'J', 'L'},
{'F', 'C'},
{'A', 'B'}
};
int main()
{
printf("char element %c\n", charTable[3][1]); //fine
printf("char element %c\n", charTable[3][8]); // accessing 4th row's 9th element which is not valid
printf("char element %c\n", charTable[85][0]);// accessing 86th row's first element which is not valid
return 0;
}
输出:
char element B
char element
char element
据我了解,C\C++ 实际上并没有对数组进行任何边界检查。这取决于操作系统来确保您访问的是有效内存。所以这是未定义的行为。
但是在这里我可以看到在不同的机器上不断的相同行为。即程序不会随时崩溃。
解决方案
但是在这里我可以看到在不同的机器上不断的相同行为。即程序不会随时崩溃。
在这里,崩溃(或分段错误)既不是期望的也不是保证的行为,行为是undefined。
这里的底线是,访问越界内存(即,不属于您的进程地址空间的内存位置)是未定义的行为。有时带有 UB 的代码似乎工作得很好,没有任何分段错误,产生一些随机值,包括 0,造成事情“工作正常”的错觉,但事实并非如此!
推荐阅读
- javascript - Highcharts没有看到数字变化
- c# - C# NEST elasticsearch 源过滤为大多数字段返回 null
- maven - 在 Maven Repository Manager UI 中按版本号排序
- android - 反应本机组件是否重新安装在方向上?
- javascript - 在这种情况下,Jquery clone(true, true) 不会触发事件侦听器 bootstrap 的 data-widget = "remove"
- php - 在数组中查找多个结果并回显它们
- javascript - 如何从 Node.JS 正确执行 sql 语句到 Oracle 数据库?
- r - 在循环回归中包含 na.action=na.exclude
- arrays - 如何从wordpress中的发布元数据中获取数组数组
- android - 是否可以使用动态功能模块和 Koin 构建项目?