将大txt.file加载到C程序时出现分段错误

时间:2015-03-15 14:05:56

标签: c memory-management segmentation-fault

我用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;


}

1 个答案:

答案 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 
}