3

我很长时间没有使用 C,并且在从 CSV 填充 2D 数组时遇到了问题。文件格式是这样的:

节点,输入,输出

1,200,10393

...

这本质上是一个链表的数组表示。有 150000 个元素,每当我尝试填充数组时,都会收到一条错误消息,提示“main.exe 中 0x000000013facb957 处的未处理异常:0xC00000FD:堆栈溢出。” 我在具有 16GB RAM 的 64 位机器上,并且正在使用具有 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 );
}

当我分配一个较小的数组时,代码似乎可以工作,但是当它这么大时就失败了。我想我应该有足够的内存来处理这个大小的数组。

4

2 回答 2

7
int map[150000][2];

似乎至少 2 * 4 * 150000 字节(假设是现代 32 位架构),大约是 1.2MB。知道现代操作系统通常设置几兆字节的堆栈大小,这实际上可能是问题所在。您的计算机拥有数 GB 的 RAM 并不意味着所有这些 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()
{
    ...
}
于 2012-12-30T18:29:04.950 回答
2

数组太大而无法放入堆栈。尝试将其移到函数之外:

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

等等。

于 2012-12-30T18:28:08.160 回答