受'bad'指令影响的变量

Variables being affected by 'bad' instructions

本文关键字:变量 影响 bad 指令      更新时间:2023-10-16

下面是我的代码,用于解决PE问题7("找到第10001个素数"):

#include <iostream>
using namespace std;
bool isPrime(int n, int primes[], int l){
    int i=0;
    for (int i=0; i < l; i++){
        if (primes[i] != 0 && n%primes[i] == 0){
            return false;
        }
    }
    return true;
}
int main()
{
    int k=3;
    int primes[10001] = {0};
    primes[0]=2;
    const int l=sizeof(primes)/sizeof(primes[0]);
    int N=0;
    while (N < l){
        if(isPrime(k, primes, l)==true){
            primes[++N]=k;
        }
        k+=2;
    }
    cout << primes[l-1] << endl;
    return 0;
}

这段代码解决了这个问题,但是其中有一个错误:在while循环的最后一次迭代中,指令是设置primes[10001]=k;,它试图改变数组中不存在的元素的值。如果我不将其声明为常量,并且(作为一种故障排除方法)在while循环中将l替换为10001,则在循环结束时l的值将等于第10002个素数。

下面是发生这种情况的主要功能部分:

int main()
{
    int k=3;
    int primes[10001] = {0};
    primes[0]=2;
    int l=sizeof(primes)/sizeof(primes[0]);
    int N=0;
    while (N < l){
        if(isPrime(k, primes, 10001)==true){
            primes[++N]=k;
        }
        k+=2;
    }
    cout << l << endl;
    return 0;
}

我的问题是,为什么会发生这种情况?我确实知道一个简单的修复是在l-1处停止循环(或者更好的是,用N=1初始化,然后增加N),但我更感兴趣的是这段代码如何影响一个没有显式(直接?)涉及代码坏部分的变量。

谢谢!

[]运算符不做边界检查。some_array[102],将简单地去102 * sizeof(type),如果它在你的数组之外,它在你的数组之外。c++不会在意的。

如果你很幸运,你的程序会崩溃,这些是可能产生的一些最讨厌的错误,有时你可能只是改变了别人的变量。

这就是为什么我在工作中反复使用std::arraystd::vector,因为它们带有.at(i)函数,具有边界检查。