Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 受'影响的变量;坏的';说明书_C++ - Fatal编程技术网

C++ 受'影响的变量;坏的';说明书

C++ 受'影响的变量;坏的';说明书,c++,C++,下面是我的代码,用于解决PE的问题7(“找到第10001个素数”): 我的问题是,为什么会发生这种情况?我确实知道一个简单的解决方法是在l-1处停止循环(或者更好,用N=1初始化,然后在N之后递增),但我更感兴趣的是,这段代码如何影响一个没有明确(直接?)涉及到代码糟糕部分的变量 谢谢大家! 操作符不执行边界检查some_array[102],如果它在您的数组之外,那么它将简单地变为102*sizeof(type)。C++不会在意.< /P> 如果幸运的话,你的程序会崩溃,有时你可能会改变别人的

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

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


谢谢大家!

操作符不执行边界检查
some_array[102]
,如果它在您的数组之外,那么它将简单地变为102*sizeof(type)。C++不会在意.< /P> 如果幸运的话,你的程序会崩溃,有时你可能会改变别人的变量,那么这些就是可能产生的最糟糕的错误


这就是为什么我在工作中反复提到使用
std::array
std::vector
的原因,因为它们附带了
。at(I)
函数具有边界检查。

它试图更改数组中不存在的元素的值。
您的内存被重写了。一旦你这么做了,所有关于将会发生什么的赌注都将落空。未定义的行为。任何事情都有可能发生。但出于好奇,至少粗略地说,当数组的元素不存在时,背景中发生了什么会导致程序写入
l
(而不是任何其他变量,或者根本不存在?“如果你幸运的话…”。如果你运气不好,那么程序中的其他地方就会出现一些看似不相关的bug,你将花费漫长的不眠之夜试图找到这个bug的来源。
#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;
}
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;
}