c++数组越界不报错,是因为将数组当指针处理吗?

int array[ 3 ] = { 1, 2, 3 } ;
std::cout << array[3] << std::endl;
std::cout << array[4] << std::endl;
std::cout << array[100] << std::endl;
上面的代码输出为
0
-858993460
-858993460
0
-858993460
没有报错是因为直接将 array[3]当做*(array+3)处理吗?
那为什么array[3],array[4]输出结果相同?

阅读 4.8k
2 个回答

没有报错是因为直接将array[3]当做*(array+3)处理吗?

可以这么理解。以C++的尿性来看,这样最简单,最快,也方便各种魔幻用法。检测越界这种事应该交给库,或者更高级的语言。

那为什么array[3]array[4]输出结果相同?

Visual C++ 编译器会在调试模式下把未初始化的内存用0xCC填充。如果输出字符串,就是喜闻乐见的烫烫烫。如果输出int32,就是-858993460。

[...new Uint8Array(Int32Array.of(-858993460).buffer)].map(e => e.toString(16))
// <- ["cc", "cc", "cc", "cc"]

也可以搜索“补码在线计算器”自己验证。

个人看法:

编译器不检测越界错误,
只有运行时候访问到了系统的违法地址,系统会抛给程序错误,程序继续上推

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题