0
#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:堆栈溢出。为什么会这样以及如何解决?

4

5 回答 5

3

尝试将其声明为全局变量 - 在main方法()之外。否则它将被分配到远小于堆的栈上。另一种解决方案是使用 动态分配new,但这更容易出错。

于 2012-04-04T14:19:13.710 回答
3

局部变量在堆栈上分配,但堆栈是有限的。您可能可以通过编译器上的开关来增加限制。

问题是您声明的数组非常大。一个简单的修复方法是将其从堆栈上更改为动态分配:

std::vector<long> x(262144);
于 2012-04-04T14:26:08.637 回答
2

发生这种情况是因为在堆栈上分配了一个本地数组。您可以通过使用动态数组(使用 new 创建的)、向量或在全局范围内声明数组来避免这种情况。

于 2012-04-04T14:19:20.060 回答
0

您可以使用static long x[262144]; 它确实将分配移到堆栈之外,您根本不需要修改代码。

于 2012-04-04T14:57:56.797 回答
0

基本上,您应该动态分配 x 数组,如本文所示。下面的示例是从文本中提取的,如果您将其更改为适合您的情况,它应该可以正常工作。

double *num; 
num = (double *) malloc (BUFSZ* sizeof(double))
于 2012-04-04T14:20:20.837 回答