VS2013与cygwin

天之骄子呃 2014-10-12 08:27:06
这是一道求完数的题(完数的定义:如果一个大于1的正整数的所有因子之和等于它的本身,则称这个数是完数,比如6,28都是完数:6=1+2+3;28=1+2+4+7+14。)
下面的代码在cygwin里运行没有任何问题,
但是在vc6.0里是报内存不能written,
而在vs2013则是最后一个完数不停出现 直到最后我把数组a[20]最小改成a[23]才没问题
这是怎么回事呢?

int i, j, sum, a[20], k;
for (i = 1; i <= 1000; i++)
{
sum = 0;
k = 0;

for (j = 1; j < i; j++)
{
if (i%j == 0)
{
sum += j;
a[k] = j;
k++;
}
}
if (i == sum)
{
cout << i << "it's factors are ";
for (j = 0; j < k; j++)
{
cout << a[j] << ' ';
}
cout << endl;
}
}
...全文
200 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
超级能量泡泡 2014-10-15
  • 打赏
  • 举报
回复
引用 楼主 u014402634 的回复:
这是一道求完数的题(完数的定义:如果一个大于1的正整数的所有因子之和等于它的本身,则称这个数是完数,比如6,28都是完数:6=1+2+3;28=1+2+4+7+14。) 下面的代码在cygwin里运行没有任何问题, 但是在vc6.0里是报内存不能written, 而在vs2013则是最后一个完数不停出现 直到最后我把数组a[20]最小改成a[23]才没问题 这是怎么回事呢?
int i, j, sum, a[20], k;
	for (i = 1; i <= 1000; i++)
	{
		sum = 0;
		k = 0;
		
		for (j = 1; j < i; j++)
		{
			if (i%j == 0)
			{
				sum += j;
				a[k] = j;
				k++;
			}
		}
			if (i == sum)
			{
				cout << i << "it's factors are ";
				for (j = 0; j < k; j++)
				{
					cout << a[j] << ' ';
				}
				cout << endl;
			}
	}
主要原因可能是你用cygwin gcc时用的是release模式编译,去除了越界警告,而用VS时可能用的是debug的。
赵4老师 2014-10-13
  • 打赏
  • 举报
回复
判断是否越界访问,可以在数组的最后一个元素之后对应的地址处设置数据读写断点。如果该地址对应其它变量干扰判断,可将数组多声明一个元素,并设置数据读写断点在该多出元素对应的地址上。
#include <time.h>
#include <stdlib.h>
#include <windows.h>
int main() {
    int a,b[11];//本来是b[10],为判断哪句越界,故意声明为b[11]

    srand((unsigned int)time(NULL));//按两次F11,等黄色右箭头指向本行时,调试、新建断点、新建数据断点,地址:&b[10],字节计数:4,确定。
    while (1) {//按F5,会停在下面某句,此时a的值为10,b[10]已经被修改为对应0..4之一。
        b[(a=rand()%11)]=0;
        Sleep(100);
        b[(a=rand()%11)]=1;
        Sleep(100);
        b[(a=rand()%11)]=2;
        Sleep(100);
        b[(a=rand()%11)]=3;
        Sleep(100);
        b[(a=rand()%11)]=4;
        Sleep(100);
    }
    return 0;
}
天之骄子呃 2014-10-12
  • 打赏
  • 举报
回复
引用 3 楼 dragoo1 的回复:
i=360 j=1,2,3,4,5,6,8,9,10,12,15;18,20,24,30,36,40,45,60,72,90; j=90的时候越界了
sorry 发错表情了
天之骄子呃 2014-10-12
  • 打赏
  • 举报
回复
引用 3 楼 dragoo1 的回复:
i=360 j=1,2,3,4,5,6,8,9,10,12,15;18,20,24,30,36,40,45,60,72,90; j=90的时候越界了
这个是怎么调出来的?
dragoo1 2014-10-12
  • 打赏
  • 举报
回复
i=360 j=1,2,3,4,5,6,8,9,10,12,15;18,20,24,30,36,40,45,60,72,90; j=90的时候越界了
天之骄子呃 2014-10-12
  • 打赏
  • 举报
回复
引用 1 楼 lovesmiles 的回复:
因为你的内存越界了,这个a[20]的20你是怎么来的?你确定所有的数的因子个数不超过20个吗?如果不确定,应该把这个数组定大的一点,最好定成a[100] 。k++超过20时,就会造成a[k]访问数组越界。 因为不同编译器对变量的内存存方位置不一样,对于内存越界,不同的编译器处理方式不一样。所以你在不同编译器看到不同的反应。
嗯1000因子最多也没超过20个 15个左右 差这么多为什么会内存越界呢? vs对内存存放方式大致是什么样的?
勤奋的小游侠 2014-10-12
  • 打赏
  • 举报
回复
因为你的内存越界了,这个a[20]的20你是怎么来的?你确定所有的数的因子个数不超过20个吗?如果不确定,应该把这个数组定大的一点,最好定成a[100] 。k++超过20时,就会造成a[k]访问数组越界。 因为不同编译器对变量的内存存方位置不一样,对于内存越界,不同的编译器处理方式不一样。所以你在不同编译器看到不同的反应。

64,639

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧