C++调试遇到HEAP CORRUPTION DETECTED的错误与解决方法
程序员文章站
2022-06-01 16:06:33
...
今天在oj的网站上看到一道题:用筛数法输出0到N所有的素数。
这是一道很常规的题,代码也很短,先贴上代码:
//用筛法求之N内的素数。
#include<iostream>
using namespace std;
int main()
{
int n;
scanf_s("%d", &n);
int* p = new int[n];
int i,j;
for (i = 1; i <= n; i++)
{
*(p + i) = i;
}
for (i = 2; i <= n; i++)
{
for (j = 2; i * j <= n; j++)
*(p + i * j) = 1;
}
for (i = 2; i < n; i++)
if (*(p + i) != 1)
printf("%d ", *(p + i));
delete[]p;
return 0;
}
代码很短,看上去也没有什么逻辑错误,编译一下。
编译通过,输入一个100,结果正确,但是跳出了一个警告窗口:
明明编译没有报错,代码也是正确的,为什么还会跳出警告窗口呢?
看一下内容,“heap corruption detected”
检测到堆内存溢出
堆(heap),是一种数据结构,四大存储区之一(另外三个分别是代码区,数据区,栈);
我们知道,一般我们定义的局部变量是存放在栈中的,看一下代码便不难确定是动态分配内存空间的时候出现了问题;
int* p = new int[n];
为了根据输出的N确定数组大小,我选择了动态分配内存空间的办法,new语句给p数组分配了n个int的内存,接下来是调用数组p:
for (i = 1; i <= n; i++)
{
(p + i) = i;
}
虽然这里根据需要只给n个数组元素赋了值,但最后一个赋值的是(p+n),
而我们数组最大是到*(p+n-1),所以造成了内存溢出。
我们只要在分配内存的时候多分配一点就好了。
所以在遇到以上问题的时候一定要检查代码的内存分配有没有溢出,特别是在动态分配内存的时候。
当然,我们可以通过更简单的方法求素数。
#include<iostream>
using namespace std;
int main()
{
int arr[1000]={0};
for(int i=2;i<1000;i++)
arr[i]=1;
for(int j=2;j<=500;j++)
{
if(arr[j]==1)
{
for(int n=2*j;n<1000;n+=j)
arr[n]=0;
}
}
for(int m=2;m<1000;m++)
{
if(arr[m]==1)
cout << m <<" ";
}
cout << endl;
return 0;
}
但是这里不能根据输入的N来确定数组大小了。
编程起步,有不对的地方谢谢指正。????
上一篇: vue新增属性问题