欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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,结果正确,但是跳出了一个警告窗口:
C++调试遇到HEAP CORRUPTION DETECTED的错误与解决方法
明明编译没有报错,代码也是正确的,为什么还会跳出警告窗口呢?
看一下内容,“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来确定数组大小了。
编程起步,有不对的地方谢谢指正。????

相关标签: 笔记