堆栈溢出(参数:0x00000001、0x00442FF8)

Stack overflow (parameters: 0x00000001, 0x00442FF8)

本文关键字:0x00442FF8 0x00000001 栈溢出 参数 堆栈      更新时间:2023-10-16

算法检查变量"a"answers"x"是否都是素数。如果是,它只是简单地宣布这些是素数。需要50个,当涉及到第六个位置时,程序显示错误:

ConsoleApplication3.exe中0x00D02509处引发异常:0xC00000FD:堆栈溢出(参数:0x00000001、0x002D2F5C)。ConsoleApplication3.exe中0x00D02509处未处理的异常:0xC00000FD:堆栈溢出(参数:0x00000001、0x002D2F5C)。

#include "stdafx.h"
#include <iostream>
using namespace std;

int CheckIfPrime(long int n)
{
    if (n<2) return 0;
    for (int i = 2; i*i <= n; i++)
        if (n%i == 0) return 0;
    return 1;
}
int pow(int ap, int nt)
{
    if (nt == 0)
        return 1;
    else
        return ap *= pow(ap, --nt);
}
void CountA(int *aValue, int x)
{
    *aValue = (pow(2, x) - 1);
}
int main()
{
    int x = 1;
    int a = 0;
    int *aPointer = &a;
    for (int i = 0; i <= 50;)
    {
        x++;
        if (CheckIfPrime(x))
        {
            CountA(aPointer, x);
            if (CheckIfPrime(a))
            {
                cout << i << ". X = " << x << " a = " << a  << " are prime " << endl;
                    i++;
            }
        }
        else
        {
            cout << "";
        }
    }
    getchar();
    return 0;
}

函数中存在堆栈溢出:

int pow(int ap, int nt)
{
  if (nt == 0)
    return 1;
  else
    return ap *= pow(ap, --nt);
}

对于非常大的nt,它将在递归中进入太深,导致SO

您正试图为x的一些相当大的值计算精确的整数2的幂x。任何普通的数据类型都不能容纳该值。但是,如果你有一个数据类型保持这个值,那么用这种简单的方法测试结果减去1是否是素数将比宇宙的生命花费更多的时间。

你在攻击一个非常困难、研究得很好的问题,只把天真的无知当作工具。

https://primes.utm.edu/mersenne/