C中的大型2D阵列 - Stack OverFlow错误

时间:2012-12-30 18:22:25

标签: c arrays stack-overflow

我没有长时间使用过C,而且我在用CSV填充2D数组时遇到了问题。文件格式如下:

节点,输入,输出

1,200,10393

...

这实际上是链表的数组表示。有150000个元素,每当我尝试填充数组时,我都会收到错误消息      “main.exe中0x000000013facb957处的未处理异常:0xC00000FD:堆栈溢出。” 我是64位机器,内存为16GB,我使用的是带有x64构建配置的VS C ++ 2010 Express。

int main(int argc, char *argv[])
{

int counter = 0;
char line [ 1024 ];
int map[150000][2] = {0};
char *comma = ",";
char *token;
int index;
int in, out;
char* end;
int nodeID;
FILE *fp;

fp = fopen("mapsorted.txt","r"); // read mode

if( fp == NULL )
{
  perror("Error while opening the file.\n");
  exit(EXIT_FAILURE);
}

//Skip header line
fgets ( line, sizeof line, fp );

while ( fgets ( line, sizeof line, fp ) != NULL) /* read a line */
{
    //first part - the index for storage
    token = strtok(line,comma);
    index = strtol(token,&end,10);

    //second part
    token = strtok(NULL,comma);
    in = atoi(token);

    //third part
    token = strtok(NULL,comma);
    out = atoi(token);

    //store in array
    map[index][0] = in;
    map[index][1] = out;
}
fclose ( fp );
}

当我分配一个较小的数组时,代码似乎有效,但是当它很大时会失败。我想我应该有足够的内存来处理这个大小的数组。

2 个答案:

答案 0 :(得分:7)

int map[150000][2];

似乎至少有2 * 4 * 150000字节(假设采用现代32位架构),大约为1.2MB。知道现代操作系统通常会设置几兆字节的堆栈大小,这实际上可能是问题所在。您的计算机具有几千兆字节的RAM并不意味着您的进程可以使用它,特别是不在堆栈中。对于大型数组,请尝试malloc()堆上一些内存:

int (*map)[2] = malloc(sizeof(*map) * 150000);

int *map = malloc(150000 * 2 * sizeof(*map));

(注意第二种情况下的尺寸!),或将其声明为static以将其移出堆栈空间:

static int map[150000][2];

或者简单地将其设为全局变量以实现类似的行为:

int map[150000][2];

void foo()
{
    ...
}

答案 1 :(得分:2)

数组太大,无法放入堆栈。尝试将其移出函数:

static int map[150000][2] = {0};
int main(int argc, char *argv[])
{

等等。