将大 txt.file 加载到 C 程序时出现段错误
Segmentation fault while loading big txt.file into C program
我用C语言写了一个程序。当我用我的小 txt 文件作为参数尝试 运行 时,我没有遇到任何问题。不幸的是,当我尝试加载更大的文件时,我遇到了分段错误(核心已转储。甚至我的主要功能的 1 行都没有执行。这是负责启动和加载 txt 文件的部分代码作为我的 argv [1] argument.I 真的看不到 problem.Big Txt 文件在哪里,大约 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;
}
首先是一些近似值:
对于 13MB 的数据,您的文本文件肯定包含超过 100 万条边(假设节点 x 和 y 分别平均表示 3 位数字后跟 space,工资平均 1 位后跟 space) 和至少 1400 个节点。
您的可变长度数组 Graph[E] 和 visited[N+1] 是局部变量,因此存储在堆栈中。假设每个整数有 4 个字节,那么要放入堆栈的数据就超过 12 MB。
堆栈中所需的数据量超过了大多数 linux 系统上的常用默认堆栈大小 (8 MB)。
您可以考虑增加堆栈大小,如 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
}
我用C语言写了一个程序。当我用我的小 txt 文件作为参数尝试 运行 时,我没有遇到任何问题。不幸的是,当我尝试加载更大的文件时,我遇到了分段错误(核心已转储。甚至我的主要功能的 1 行都没有执行。这是负责启动和加载 txt 文件的部分代码作为我的 argv [1] argument.I 真的看不到 problem.Big Txt 文件在哪里,大约 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;
}
首先是一些近似值:
对于 13MB 的数据,您的文本文件肯定包含超过 100 万条边(假设节点 x 和 y 分别平均表示 3 位数字后跟 space,工资平均 1 位后跟 space) 和至少 1400 个节点。
您的可变长度数组 Graph[E] 和 visited[N+1] 是局部变量,因此存储在堆栈中。假设每个整数有 4 个字节,那么要放入堆栈的数据就超过 12 MB。
堆栈中所需的数据量超过了大多数 linux 系统上的常用默认堆栈大小 (8 MB)。
您可以考虑增加堆栈大小,如 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
}