我用C语言编写了一个程序。尝试使用我的小txt文件作为参数运行它时没有问题。不幸的是,当我试图加载更大的文件时,我收到了分段错误(核心转储。甚至我的主函数的一行也没有执行。这是代码的一部分响应启动和加载txt文件作为我的argv [1]参数我真的没看到问题出在哪里。大文件大小约为13 MB。我正在使用linux(ubuntu)。我将非常感谢您的帮助。
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
int x;
int y;
int wage;
}Edge;
int main(int argc, char *argv[]) {
printf("Program starts");
int x,y,z;
int counter = 1;
int N,E; //node,edges
FILE *fid;
fid = fopen(argv[1],"r");
fscanf(fid,"%d%d",&N,&E);
Edge Graph[E];
int visited[N+1];
while(counter <= E){
fscanf(fid, "%d%d%d", &x, &y,&z);
Graph[counter-1].x=x;
Graph[counter-1].y=y;
Graph[counter-1].wage=z;
counter=counter+1;
}
printf("\nWe load all edges. Here is our Graph");
fclose(fid) ;
printf("Program ends");
return 0;
}
答案 0 :(得分:2)
首先是一些近似值:
使用13MB的数据,您的文本文件肯定包含超过100万条边(假设节点x和y各自代表平均3位数后跟一个空格,工资平均为1位,后跟空格)和至少1400个节点。
您的可变长度数组Graph [E]和visited [N + 1]是局部变量,因此存储在堆栈中。假设每个整数有4个字节,那就是要放在堆栈上的12 MB以上的数据。
在大多数Linux系统(8 MB)上,堆栈上所需的数据量超过了usal默认堆栈大小。
您可以考虑增加堆栈大小,如this SO question中所述。
但你应该更好地考虑动态分配:
Edge *Graph = calloc (sizeof(Edge),E);
int *visited = calloc (sizeof(int), N+1);
if (Graph==NULL || visited==NULL) {
printf ("Oops ! Out of memory (%d edges, %d notes) !!", E, N+1);
exit (1); // or some other kind of error handling
}