【发布时间】:2015-09-14 03:54:10
【问题描述】:
在编译型编程语言(例如 C)和解释型语言(例如 MATLAB)中访问越界(负数或其他不可访问)索引有什么区别?
根据本网站的建议,我研究了许多有关访问越界索引的线程。然而,这些线程中的大多数只专注于解决源问题。也就是说,我已经能够从这个站点获得在使用 C 时访问越界索引会导致未定义的行为。通过使用 MATLAB 进行实验,我猜测解释性语言会执行测试以确定索引是否应该不可访问,并在访问越界索引之前“捕获”编写不佳的代码。这实际上是一般解释语言的情况,还是类似于 C(编译)语言,导致发生一定程度的未定义行为?在任何编译语言的程序中访问越界索引是否会导致未定义的行为?
【问题讨论】:
-
这取决于语言。 Java 和 C# 已编译,但它们仍执行索引检查。它与编译/解释无关。
-
啊,那么 MATLAB 实际上会检查越界索引吗?既然如此,我还假设没有访问由此产生的“越界”内存?
-
许多语言检查越界访问并拒绝滥用内存(例如 Pascal)。它是一种编译语言。其他语言根本没有越界元素。如果您尝试访问不存在的元素,则会创建该元素(想想
awk,Perl,...)。其他语言只是将其保留为未定义的行为(C、C++)。你得到你所得到的,这可能是也可能不是你应得或期望的——无论如何,它通常不是你想要的。 -
我认为越界访问的处理只是语言本身固有的,而不是它的实现方式。我相信这会使我的问题无效,我很感激你的洞察力。谢谢你。然而,出于纯粹的兴趣,编译语言如何检查越界访问?这是在编译之前执行的吗?
-
几乎总是在运行时完成。对于在编译时执行的边界检查等测试,您需要一个非常“丰富”的类型系统,例如依赖的类型。在没有自动边界检查的语言中,您通常可以自己实现它,或者使用各自的库函数,如 C++ vector,地址为:en.cppreference.com/w/cpp/container/vector/at
标签: c matlab interpreted-language