#file #file-io #memory-management #segmentation-fault
#файл #файл-ввод-вывод #управление памятью #ошибка сегментации
Вопрос:
Мне нужна помощь в чтении двух динамических выделенных векторов из двоичного файла. В конечном итоге возникает ошибка ошибки сегментации, но векторы остаются полными нулей (иногда без нулей и «мусора»), даже когда fread () выполняется без проблем.
Вот код, который я использую для его чтения:
struct Node *node;
node = (Node *) calloc(GRAPHSIZE,sizeof(Node));
int edgesSize = 2*GRAPHSIZE;
int *edges;
edges = (int *) calloc(edgesSize,sizeof(int));
FILE * file;
printf("nLoading graph file...n");
file = fopen ("graph1M.g","rb");
fread (amp;edges, edgesSize * sizeof(int),1,file);
fread (amp;node, GRAPHSIZE * sizeof(Node),1,file);
fclose(file);
И вот как они сохраняются:
int edgesSize = 2*GRAPHSIZE;
struct Node *node;
node = (Node *) calloc(GRAPHSIZE,sizeof(Node));
int *Edges;
Edges = (int *) calloc(edgesSize,sizeof(int));
/* put data into the vectors... */
FILE *file;
//writes file:
file = fopen ("graph1M.g","wb");
fwrite (amp;Edges, edgesSize * sizeof(int),1,file);
fwrite (amp;node, GRAPHSIZE * sizeof(struct Node),1,file);
fclose(file);
Ответ №1:
Они содержат ошибки (вы повреждаете свой стек):
fread (amp;edges, edgesSize * sizeof(int),1,file);
fread (amp;node, GRAPHSIZE * sizeof(Node),1,file);
Вы хотите это вместо:
fread (edges, edgesSize * sizeof(int),1,file);
fread (node, GRAPHSIZE * sizeof(Node),1,file);
Та же проблема с fwrite
также.
Кстати, если вы используете Linux, вам следует протестировать свои программы с помощью Valgrind. Делайте это часто, это сэкономит вам много времени.
Комментарии:
1. Тай, это решило проблему, также я посмотрю на этот Valgrind.