我一直在尝试使用c ++解决以下链接样式中的竞争问题(我尝试解决的实际问题并不公开)
http://orac.amt.edu.au/cgi-bin/train/problem.pl?set=aio18int&problemid=1032
我已经在Visual Studio中编写了一个试图解决该问题的C ++程序,但是当我运行此代码时:(有一些包含,但我无法获取格式)。
int main()
{
int n = 1;
freopen("pairin.txt", "r", stdin);
scanf("%d", &n);
int s[200005];
for (int i = 0; i < 2 * n; i++)
{
scanf("%d", &s[i]);
}
int d[100005];
for (int i = 0; i < n; i++) {
d[i] = -1;
}
for (int i = 0; i < n; i++) {
if (d[s[i] - 1] == -1) {
d[i] == s[i];
}
else {
d[i] = i - d[i];
}
}
int max = 0;
for (int i = 0; i < n; i++) {
if (d[i] > max) {
max = d[i];
}
}
freopen("pairout.txt", "w", stdout);
printf("%d", max);
return 0;
}
它返回错误: a.exe中0x00B11CC9的未处理异常:0xC00000FD:堆栈溢出(参数:0x00000000,0x00402000)。发生
然后,无论出于何种原因,Visual Studio都会打开一个名为chkstk.asm的asm文件的标签。
我知道何时正常发生此错误,但似乎触发该错误的原因是定义“ int n = 1;”。当我逐步使用调试器时,这绝对让我感到困惑。我要做的就是调试算法,而不是尝试获取int n = 1;工作。
我正在使用启用了_CRT_SECURE_NO_WARNINGS标志的Visual Studio 2017。
我在在线IDE中对此进行了尝试(注释掉了所有IO行),并且main()返回0很好。
答案 0 :(得分:1)
问题的原因在于s
和d
数组定义中。这些变量在堆栈上分配。占用空间超过1Mb,但Visual Studio中的默认堆栈大小为1Mb:
/ F 设置程序堆栈大小(以字节为单位)。如果没有此选项,则堆栈大小默认为1 MB。
因此,您的堆栈空间不足。
要解决此问题,您应该增加stack size或在堆上分配内存或减小数组大小(例如int s[100000];
和int d[50000];
)。