C++指针——奇怪的循环行为
C++ Pointers -- Weird Loop Behavior
在main中,我试图调用mymath.cpp中的一个素数函数——它有一些非常奇怪的行为,我不理解。(注意,算法不起作用然而——但这对我来说并不奇怪。)
奇怪的是,如果我评论这句话:
cout << "n:" << lastPrime->pnum <<"n";
在mymath.cpp中,我在main中的循环只运行两次。如果我把它留在里面,我的主循环一直运行到I=50;
MAIN.CPP
#include <iostream>
#include <stdlib.h>
#include <time.h>
#include "stat.h"
#include "mymath.h";
using namespace std;
int main()
{
for (int i = 3; i<= 50; i++)
{
if (isPrime(i))
{
cout << i << " is prime!n";
}
else
{
cout << i << " is NOT primen";
}
}
return 0;
}
MYMATH.CPP
#include "mymath.h"
#include <math.h>
#include <iostream>
using namespace std;
prime two;
prime * lastPrime = &two;
prime * firstPrime = &two;
bool isPrime(long long n)
{
two.pnum=2;
prime * currentPrime = &two;
if ( n < 2)
return false;
long long squareRoot = sqrt(n);
while(true)
{
if (n % currentPrime->pnum==0)
{
//n is divisible by a prime number, nothing left to do.
return false;
}
else
{
//n is not divisible by a prime... check next one
{
if (currentPrime->pprime == 0 || currentPrime->pnum > squareRoot)
{
//this is prime
prime addPrime;
addPrime.pnum=n;
addPrime.pprime=0;
lastPrime->pprime=&addPrime;
lastPrime=&addPrime;
cout << "n:" << lastPrime->pnum <<"n";
return true;
}
else
{
//may not be prime, check next
currentPrime = currentPrime->pprime;
}
}
}
}
return true;
}
代码具有未定义的行为,因为一个名为addPrime
的局部变量的使用寿命已超过:
lastPrime->pprime=&addPrime;
lastPrime=&addPrime;
cout << "n:" << lastPrime->pnum <<"n";
return true;
} // 'lastPrime' is now a dangling pointer because it holds the address
// of 'addPrime' whose lifetime has ended.
要进行更正,需要使用new
动态分配prime
但是,似乎(如果没有prime
的定义,我不确定)代码正在构建遇到的prime
的列表。建议使用std::vector<prime>
来构建列表,并让它为您管理内存。
无论出于何种原因,如果std::vector<prime>
不是一个选项,则确保prime
的所有实例都是动态分配的,而不是动态分配实例和非动态分配实例(如全局two
)的混合,因为delete
是非法的,即未动态分配的对象。
添加或删除无害代码时出现的问题几乎总是由错误指针造成的;有时它会覆盖一些重要的东西,有时它也会覆盖一些无关紧要的东西。
在这种情况下,坏指针来自于获取addPrime
的地址并保存它。在块的末尾,addPrime
消失,指向它的指针变为无效。
相关文章:
- 用于C++中带有数组和指针的循环
- C++指针在 for 循环中被覆盖
- C++ - 循环访问指针数组会导致错误
- 为什么循环会导致指针出现问题?
- 如何循环访问 cpp 中的函数返回的字符指针数组
- foor 循环的最后一次迭代中的指针更改
- 在 for 循环中定义的临时数组,并分配给属于指针数组的指针
- foreach循环中指针到std::unique_ptr的隐式转换
- 在循环(C++)中用新指针填充映射
- 使用基于范围的指针循环和向量时出现C++错误
- 使用基于范围的for循环取消对矢量指针的引用
- 在指针迭代中使用for循环时出现分段错误
- 用基于范围的for循环填充指针向量
- 指针上的 For 循环:它会移动整个地址范围吗?
- 在循环迭代期间将引用保存到矢量中的空指针
- For 循环使用指针遍历数组无法正常工作
- 带有指针的嵌套 foreach 循环?
- 循环和内存管理中的指针算术C++?
- 对于循环不循环和检测字符数组 [指针和字符数组]
- 构造函数中的循环指针注入