进程返回 -1073741819 (0xC0000005)(为啥??)
Posted
技术标签:
【中文标题】进程返回 -1073741819 (0xC0000005)(为啥??)【英文标题】:Process returned -1073741819 (0xC0000005) (why though??)进程返回 -1073741819 (0xC0000005)(为什么??) 【发布时间】:2019-03-25 16:19:07 【问题描述】:所以我正在解决我的作业,我做了这段代码,它应该找到 [a,b] 区间内两个素数之间的最大差异,我得到“进程返回 -1073741819 (0xC0000005) "
#include <iostream>
#include <vector>
#include <bitset>
using namespace std;
bitset <10000000>v;
int main()
for (int i = 2; i < 10000000; i++)
if (v[i] == 0)
for (int j = i * i; j < 10000000; j += i)
v[j] = 1;
int n, a, b, maxi = 0, mini = 0, smax = 0;
cin >> a >> b;
int poz = a;
while (v[poz] == 1)
poz++;
int prev = poz;
poz++;
while (v[poz] == 1 && poz < b)
poz++;
if (poz == b && v[b] == 1)
cout << -1; return 0;
int next = poz;
poz++;
while (poz <= b)
if (next - prev > smax)
smax = next - prev;
maxi = next;
mini = prev;
if (v[poz] == 0)
prev = next;
next = poz;
poz++;
cout << mini << " " << maxi;
return 0;
我预计 43 和 47
【问题讨论】:
阅读this 您是否尝试过使用调试器单步执行您的代码? 我猜这个任务是关于两个连续素数之间的最大差异,否则它只是第一个和最后一个素数之间的差异 @Scamtex 这不是问题,因为 1)v
不在堆栈中; 2)提问者没有得到堆栈溢出,而是访问冲突。
你的意见是什么?
【参考方案1】:
当i
是46349
,i*i
是2,148,229,801
时,在您的初始化循环中,这大于适合有符号的 32 位整数,因此计算结果为 -2,146,737,495
。 v[j]
然后导致崩溃。
您应该修改代码以使用更大的数据类型或将i
的限制设置为sqrt(10000000)
而不是10000000
。
【讨论】:
不,i*i
对筛子是正确的。在考虑 5 的倍数时,您不需要考虑 5x2 或 5x3(它们将被排除为 2 和 3 的倍数), - 您从 5x5 开始。 (但重点是,同样你不需要考虑 sqrt(10million) 以上的 i
的值)。
好的,***说在第 3 步中从 2p 开始 en.wikipedia.org/wiki/Sieve_of_Eratosthenes
在我的机器上工作。但是,我使用的是 64 位 int。我认为它会在使用 32 位 int 的机器上失败。
@Eljay 你使用的是什么编译器,它有 64 位 int ? (当然是 64 位指针和长整数 - 但 int ??!?)
64 位 int -- int64_t,包括 我猜当i
很大时i*i
会溢出,从而导致j
为负值,并导致v[j]=1;
出现访问冲突。
【讨论】:
【参考方案3】:您在v[j]=1;
线上存在潜在的分段错误,其中j
可能超过10000000
。
请检查你的界限。
【讨论】:
以上是关于进程返回 -1073741819 (0xC0000005)(为啥??)的主要内容,如果未能解决你的问题,请参考以下文章
进程以退出代码 -1073741515 (0xC0000135) 结束
这是啥错误,我该如何解决?进程以退出代码 -1073740791 (0xC0000409) 结束
模拟器:进程以退出代码 -1073741515 (0xC0000135) 结束