进程返回 -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】:

i46349i*i2,148,229,801 时,在您的初始化循环中,这大于适合有符号的 32 位整数,因此计算结果为 -2,146,737,495v[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,包括 【参考方案2】:

我猜当i 很大时i*i 会溢出,从而导致j 为负值,并导致v[j]=1; 出现访问冲突。

【讨论】:

【参考方案3】:

您在v[j]=1; 线上存在潜在的分段错误,其中j 可能超过10000000

请检查你的界限。

【讨论】:

以上是关于进程返回 -1073741819 (0xC0000005)(为啥??)的主要内容,如果未能解决你的问题,请参考以下文章

把握linux内核设计思想(十三):内存管理之进程地址空间

进程以退出代码 -1073741515 (0xC0000135) 结束

这是啥错误,我该如何解决?进程以退出代码 -1073740791 (0xC0000409) 结束

模拟器:进程以退出代码 -1073741515 (0xC0000135) 结束

进程完成,退出代码 -1073740791 (0xC0000409) 错误未打开网站

用c语言编写modbus程序