【发布时间】:2020-06-08 07:07:37
【问题描述】:
编辑:似乎错误只是 9,999,999,999,999 对于数组来说太大了。
我的代码出现此错误“程序收到信号 sigsegv 分段错误”。
基本上我的代码是做一个整数分解,这个练习可以在 codeabbey here 上看到。基本上我会收到像 1000 这样的输入并将它们作为它们的因子的乘积输出,在这种情况下为 2*2*2*5*5*5。
我通过使用埃拉托色尼筛法生成的素数向量来完成上述操作。
根据网站,输入的位数不会超过13,因此我的最高数字是9,999,999,999,999。下面是我的代码。
#include <iostream>
#include <vector>
#include <cstring>
unsigned long long int MAX_LIMIT = 9999999999999;
std::vector<unsigned long long int> intFactorisation (unsigned long long int num) {
std::vector<unsigned long long int> answers;
static std::vector<unsigned long long int> primes;
if (primes.empty()) { // generate prime numbers using sieve method
bool *arr = new bool[MAX_LIMIT];
memset (arr, true, MAX_LIMIT);
for (unsigned long long int x = 2; x*x < MAX_LIMIT; x++) {
if (arr[x] == true) {
for (unsigned long long int y = x*x; y < MAX_LIMIT; y += x) {
arr[y] = false; // THIS LINE ALWAYS HAS AN ERROR!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
}
}
}
for (unsigned long long int x = 2; x <= MAX_LIMIT; x++) {
if (arr[x]) {
primes.push_back(x);
}
}
}
std::vector<unsigned long long int>::iterator it = primes.begin(); // start the factorisation
while(it != primes.end()) {
if (num % *it == 0) {
answers.push_back(*it);
num/=*it;
}
else {
it++;
}
if (num == 1) {
break;
}
}
return answers;
}
int main() {
int maxi;
std::cin >> maxi;
int out[maxi];
for (int x = 0; x < maxi; x++) {
std::cin >> out[x];
}
for (auto it : out) {
std::vector<unsigned long long int> temp = intFactorisation(it);
for (std::vector<unsigned long long int>::iterator it = temp.begin();
it != temp.end(); it++) {
if (it == temp.end() - 1) {
std::cout << *it << " ";
}
else {
std::cout << *it << "*";
}
}
}
}
但是,由于某种原因,程序将始终在函数 intFactorisation 中的 arr[y] = false 处终止。使用 CodeBlocks 时,我会在屏幕左下方看到一条通知,显示分段错误消息。
我已经在我可笑的大数组上使用了“新”,所以内存应该在堆上。我曾尝试使用较小的 MAX_LIMIT,例如 100,000,并且我的功能有效。有谁知道为什么?
另外,我想知道为什么我不需要取消引用我的指针 arr。例如, arr[y] = false 有效,但 *arr[y] 或 (*arr)[y] 无效。希望这也能得到澄清。
感谢您阅读本文,感谢您的帮助。
【问题讨论】:
-
考虑
y == MAX_LIMIT的情况,你的代码会发生什么? -
int out[maxi];-- 在其他地方使用用过的std::vector。你为什么不在这里也用它? -
除非
sizeof(bool)是一,否则memset (arr, true, MAX_LIMIT);不会按照您的想法执行,但会导致未定义的行为。 -
如果
sizeof(bool)是 1,则您正尝试为该数组分配 10 TB。如果是 4 个(很可能),那就是 40 TB。你真的有那么多闲钱吗? -
@user6088862 "如果这是问题,为什么使用较小的 MAX_LIMIT 有效?" 未定义的行为是未定义的。一种可能的表现形式是:看起来有效。
标签: c++ arrays segmentation-fault