受'bad'指令影响的变量
Variables being affected by 'bad' instructions
下面是我的代码,用于解决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::array
和std::vector
,因为它们带有.at(i)
函数,具有边界检查。
相关文章:
- 是否可以影响 C++ 中回调函数的局部变量?
- 为什么线程对类变量所做的更改没有影响?
- 如何影响派生类中受保护的基变量
- 我想制作受变量变化(c ++)影响的字符串
- 整数溢出是否会影响其他变量
- 为什么键入块会影响封闭范围中的变量
- 在类中添加新的成员变量会影响二进制兼容性
- 为什么C 全局变量不影响程序的内存使用情况
- 为什么跨线程更改共享变量的代码显然没有受到竞争条件的影响
- gcc优化对具有明显恒定变量的循环的影响
- 变量会影响性能吗
- C++在保存受用户输入影响的变量的状态时使用临时变量或类变量
- 如何防止char输入影响int变量
- 使函数内联是否会影响绑定到其参数的临时变量的生存期
- 如何在方法中更改受方法影响的变量/java put方法的c++替代方案
- C++,其他受scanf语句影响的变量
- 输入流失败后对输入变量的影响
- C/MATLAB API接口环境变量设置影响OS X中的其他应用程序
- 局部变量(大数组)的初始化如何影响堆栈大小
- QtScript中变量影响问题