c - 使用解释语言与编译语言访问 "out-of-bounds"索引

标签 c matlab interpreted-language

使用编译型编程语言(例如 C)与解释型语言(例如 MATLAB)访问越界(负数或其他不可访问)索引有什么区别?

根据本网站的建议,我研究了许多有关访问越界索引的线程。然而,这些线程中的大多数只专注于解决源问题。也就是说,我能够从这个网站了解到,在使用 C 时访问越界索引会导致未定义的行为。通过使用 MATLAB 进行的实验,我猜测解释语言会执行测试来确定索引是否不可访问,并在访问越界索引之前“捕获”编写不佳的代码。一般来说,解释型语言实际上就是这种情况吗?还是它们与 C(编译型)语言类似,会导致一定程度的未定义行为发生?在任何编译语言的程序中访问越界索引是否会导致未定义的行为?

最佳答案

一些语言将其保留为实现“细节”,而其他语言则明确指定预期的行为......但对于几种编程语言来说,这种情况随着时间的推移而发生了变化。

关于 C,在数组中使用负索引是完全合法的(并且有用),即使这有时可能会导致崩溃或代码/数据损坏(有意或无意),因为 C 试图不限制您作为程序员。如果您知道 C 语言是如何实现的,那么对于错误寻址的基于堆栈或基于 malloc 的内存块会发生什么就没有太大的不确定性。 C 编译器可能会在编译期间发出警告,以帮助防止错误(意外的负数组索引)。

其他语言由程序员决定并尝试阻止这些操作,无论是在编译时(PASCAL 是一个很好的老例子)还是在执行时(JIT、VM 等)。除非语言规范定义了特定行为,否则没有通用规则。

即使在 C 语言中,您也可以使用多种方法来防止意外损坏,例如围绕数组内存块的守护内存区域。然后可以通过信号处理程序来处理故障。

由于大多数其他语言依赖于 C/C++ 实现,这也是“更现代”的编程语言作为规范或实现的一部分处理这些问题(负数组索引)的方式。也可以使用负数组索引的测试,但会降低性能。

C# 或 Java 变量比 C 中的变量占用更多的空间,因为它们分配更多的信息(锁、垃圾收集、监护区域等),而 C 变量的浪费空间可能仅是在不替换默认行为时的对齐造成的通过程序员更复杂的东西。

关于c - 使用解释语言与编译语言访问 "out-of-bounds"索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31085969/

相关文章:

c - MPI 和 C 结构

algorithm - 在matlab中从人脸中提取唇部区域和参数,用于口型同步

image - 在 MATLAB 中绘制两个图像之间的匹配点

interpreted-language - 什么将 vbscript 转换为机器代码?

python - 解释性语言中的链接和加载

c - 在 C 中添加日期背后的逻辑

c - 如何在没有 jtag、断点、模拟器、仿真器的情况下在目标上单步执行代码

c - 调试套接字程序

matlab - 如何使用 Matlab 的 polyfit 获得正确的曲线拟合?

performance - 速度比较-解释语言中的程序与OO