当我通过 Jim Trevor为 PL 课程编写的“ Cyclone: A safe dialect of C ”时,我正在尝试掌握 C。Trevor 和他的合著者正在尝试制作一个安全的 C 版本,因此他们在他们的语言中消除了未初始化的指针。谷歌搜索了一下在未初始化的指针上,似乎未初始化的指针指向内存中的随机位置。似乎仅这一点就使他们不安全。如果你引用一个未初始化的指针,你会跳转到内存的不安全部分。时期。但特雷弗谈论它们的方式似乎暗示它更复杂。他引用了下面的代码,并解释说当函数 FrmGetObjectIndex 取消引用 f 时,它不是在访问一个有效的指针,而是一个不可预测的地址——当 f 的空间被分配时,堆栈上的任何内容。
Trevor 所说的“分配 f 的空间时堆栈上的任何内容”是什么意思?默认情况下,“未初始化”指针是否初始化为内存中的随机位置?或者它们的“随机”行为是否与分配给这些指针的内存有关,由于堆栈上的意外行为,这些指针被填充了奇怪的值(然后被引用)。
Form *f;
switch (event->eType) {
case frmOpenEvent:
f = FrmGetActiveForm(); ...
case ctlSelectEvent:
i = FrmGetObjectIndex(f, field); ...
}