Run-Time Check Failure #2 问题

Run-Time Check Failure #2 问题

报错:Run-Time Check Failure #2 - Stack around the variable ‘a’ was corrupted.

在这里插入图片描述
简单来说,错误原因是:栈被破坏,缓存区溢出。

解决措施有两项:
一。这个措施是在CSDN上找到的,正确性待定
把 project->配置属性->c/c+±>代码生成->基本运行时检查 为 默认值 。
这个方式又导致了我代码其它错误,所以也不确定是否正确

二。堆栈的数组溢出
假设在代码中定义了a[3]数组,但最终存储了4个数值,就导致了溢出,这个是我的错误原因。

下面是我的代码,目的是分治法解决中位数问题:
问题描述
设X[ 0 : n - 1]和Y[ 0 : n – 1 ]为两个数组,每个数组中含有n个已排好序的数。找出X和Y的2n个数的中位数。
编程任务
利用分治策略试设计一个O (log n)时间的算法求出这2n个数的中位数。
数据输入
由文件input.txt提供输入数据。文件的第1行中有1个正整数n(n<=200),表示每个数组有n个数。接下来的两行分别是X,Y数组的元素。
实现提示
比较两个序列的中位数大小,如果两个数相等,则该数为整个2n个数据的中位数,否则通过比较,分别减少两个序列的查找范围,确定查找的起止位置,继续查找。

代码如下:

#pragma warning(disable : 4996)
#include<iostream>
using namespace std;
int n;
float Median(int a[], int b[], int mida, int midb)
{
	if (a[mida] == b[midb])//两中位数相等
		return a[mida];
	else if (a[mida] < b[midb] && (b[midb] < a[mida + 1] || a[mida + 1] == 0))
		return a[mida]; //a中位数比b中位数小且b中位数比a[mida+1]小,或a[mida+1]空
	else if(a[mida] > b[midb] && (a[mida] < b[midb + 1] || b[midb + 1] == 0))
		return b[midb]; //a中位数比b中位数大且a中位数比b[midb+1]小,或b[midb+1]空
	else if (a[mida] < b[midb])//a中位数比b中位数小,a选右,b选左
		return Median(a, b, (mida + n) / 2, (midb + 1) / 2);
	else if (a[mida] > b[midb])//a中位数比b中位数大,a选左,b选右
		return Median(a, b, (mida + 1) / 2, (midb + n) / 2);
}

int main()
{
	//int a[] = { 0 }, b[] = { 0 };会导致堆栈溢出错误
	int a[10] = { 0 }, b[10] = { 0 };
	FILE* fp = NULL;
	fp = fopen("input.txt","r");//打开只读文件
	if (!fp)
	{
		cerr << "input.txt访问失败!" << endl;
		return 0;
	}
	fscanf(fp, "%d", &n);	cout << n << endl;
	for (int i = 0; i < n; i++)
	{
		fscanf(fp, "%d", &a[i]);
		cout << a[i] << " ";
	}
	cout << endl;
	for (int i = 0; i < n; i++)
	{
		fscanf(fp, "%d", &b[i]);
		cout << b[i] << " ";
	}
	fclose(fp);
	cout << endl;
	system("pause");

	int mid;
	mid = Median(a, b, n / 2, n / 2);
	cout << mid << endl;
	fp = fopen("output.txt", "w");//打开只写文件
	if (!fp)
	{
		cerr << "output.txt访问失败!" << endl;
		return 0;
	}
	fprintf(fp,"%d",mid);
	fclose(fp);
	system("pause");
	return 0;
}
  • 12
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值