【发布时间】:2020-04-18 06:58:44
【问题描述】:
如果 int arr[5] 已初始化但存储了 5 个以上的元素,则额外的元素将在单独的空间中分配内存。 像turbo这样的旧编译器报告崩溃,因为某些东西被覆盖了 但是现代编译器不会发生这种情况,那么他们如何处理这个问题呢?
【问题讨论】:
-
简而言之:他们没有。他们不处理此类问题,因为代码无效。越界访问数组是未定义的行为。
-
如果你想让别人看着你,阻止你朝自己的脚开枪,C 语言不是可以做到这一点的。如果您不期望,那么是时候提高严格利用定义的行为的编码技能了。其他任何事情都是灾难的根源。想象一下,您的作业在您的设备上运行“很好”,但在您的教授(或更糟糕的是,付费客户)的设备上像波浪一样崩溃。严格遵守语言标准及其库和质量分析工具可以提高您的信心,但归根结底,这一切都是为了一件事:不要编写蹩脚的代码。
-
这里有一个很好的重点问题。我可以将其解释为 为什么现代编译器不(或不能)捕获对数组进行越界访问的尝试? 而且我认为这个问题不应该受到侮辱和蔑视已经堆积起来了。它可能是重复的,但这完全是另一回事。如果它不是重复的,则该站点需要一个答案 - 这是许多编程语言中的一个基本问题,并且会令许多新手程序员感到惊讶,偶尔也会感到困惑。
-
许多现代编译器会在编译时诊断出一些越界访问,但通常你/它无法知道索引的实际值。您唯一的希望是运行时检查。这通常因为数组可能作为指针传递而变得复杂,现在很难知道指针是否有效。访问结构成员尤其是联合存在类似的问题。对内存访问错误(错误的索引、错误的数组指针等)进行良好的运行时检查是很难做到的。您可以找到我们的 CheckPointer 等工具来执行此操作。
标签: c arrays compiler-construction