【发布时间】:2021-09-17 08:30:12
【问题描述】:
当我在 C++ 中声明一个数组时,在我的计算机上,比如说这个
int mynum[3];
mynum[0]=1;
mynum[1]=2;
mynum[2]=3;
mynum 是一个可以容纳 3 个元素的数组, 现在当我添加这一行时
mynum[3]=4;
它在 Windows 和 Ubuntu 终端上崩溃(堆栈粉碎检测到未知终止的核心转储) 但是当我使用时,
mynum[4]=56;
mynum[5]=34;
mynum[6]=23;
它没有给出任何错误(当我使用以上三行代替 mynum[3] 时) 为什么会这样?
【问题讨论】:
-
C++ 没有对普通数组进行边界检查。越界会导致未定义的行为。如果它看起来有效,那么你“un很幸运”。
-
@Someprogrammerdude 更重要的是,未定义的行为(遗憾的是)默认情况下不检查。这有很多缺点,这就是为什么它默认不启用的原因,但至少 clang 工具链具有可以检测此类错误的消毒剂。