#include<iostream>
#include <intrin.h>
using namespace std;
unsigned __int64 TimeValue=0;
unsigned __int64 rdtsc(void)
{
return __rdtsc();
};
void time_start() { TimeValue=rdtsc(); }
long long time_stop() {
return (rdtsc()-TimeValue);
}
int main()
{
long x[262144],i,k,r;
int j;
x[0] = 0;
for (i=1; i<262144; i++)
{
long r = rand()%i;
x[i] = x[r];
x[r] = i;
}
time_start();
for (j=0; j<1000; j++)
for (k=0, i=0; i<262144; i++)
k = x[k];
cout<<time_stop()/1000/262144;
}
在程序中我需要创建一个1兆字节的数组大小。在行long x [262144]
上调试程序时,会发生错误:“dgdxgdrfy.exe”中的未处理异常“0x00ff1997”:0xC00000FD:堆栈溢出。这是为什么以及如何解决它?
答案 0 :(得分:3)
尝试将其声明为全局变量 - 在main
方法()之外。否则它将被分配在远小于堆的堆栈上。另一种解决方案是使用new
进行动态分配,但这更容易出错。
答案 1 :(得分:3)
局部变量在堆栈上分配,但堆栈有限。您可以通过编译器上的开关来增加限制。
问题是你声明的非常大的数组。一个简单的修复方法会将其从堆栈更改为动态分配:
std::vector<long> x(262144);
答案 2 :(得分:2)
这是因为在堆栈上分配了本地数组。您可以通过使用动态数组(使用new创建的数组),向量或通过在全局范围内声明数组来避免这种情况。
答案 3 :(得分:0)
基本上,您应该动态分配x数组,如this article中所示。下面的示例已从文本中删除,如果您将其更改为适合您的情况,它应该可以正常工作。
double *num;
num = (double *) malloc (BUFSZ* sizeof(double))
答案 4 :(得分:0)
您可以使用static long x[262144]
;它确实将分配移到了堆栈之外,你根本不修改你的代码。