gpt4 book ai didi

c++ - 受 'bad' 指令影响的变量

转载 作者:搜寻专家 更新时间:2023-10-31 02:22:13 29 4
gpt4 key购买 nike

下面是我的代码,用于解决 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) 具有边界检查的函数。

关于c++ - 受 'bad' 指令影响的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30542727/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com