【发布时间】:2021-12-24 04:06:41
【问题描述】:
显然我正在尝试访问尚未分配的内存地址。有人可以告诉我在哪里吗? (对 n 个给定数进行质因式分解的程序)
#include <iostream>
using namespace std;
void sieve(int n){
int primes[n + 1];
for(int i = 2; i <= n; i++){
primes[i] = i;
}
for(int i = 2; i <= n; i++){
if(primes[i] == i){
for(int j = i*i; j <= n; j += i){
if(primes[j] == j){
primes[j] = i;
}
}
}
}
while(n != 1){
cout << primes[n] << " ";
n /= primes[n];
}
cout << endl;
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie();
int n;
cin >> n;
for(int i = 0; i < n; i++){
int x;
cin >> x;
sieve(x);
}
}
【问题讨论】:
-
The Sieve 的要点是您生成表一次,然后在其中查找值。为每个数字生成一次会破坏目的。 (另外,变长数组既非标准又容易出错。使用
std::vector。) -
这听起来是您学习如何使用调试器的绝佳机会。
-
仅供参考,您应该从 3 开始搜索素数并以 2 递增。数字 2 是唯一的偶素数。您可以“作弊”并创建一个最多 50 个素数的静态数组。:-)
-
你怎么知道你正在访问一个未初始化的地址?有什么症状?
标签: c++ memory-management