我没有长时间使用过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 );
}
当我分配一个较小的数组时,代码似乎有效,但是当它很大时会失败。我想我应该有足够的内存来处理这个大小的数组。
答案 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[])
{
等等。