我的程序将矩阵存储在二进制文件中,当我尝试在程序的相同使用过程中“加载”它们时,一切正常。
但是,当我关闭程序并在以后使用它时,无法访问相同的文件,并且遇到了分段错误(核心转储)错误。
这是“加载”矩阵的函数:
void Loading(int mat**){
char* name = malloc(sizeof(char)*20);
printf("Enter name of the file");
scanf("%s",name);
FILE* file=fopen(name,"rb");
if (file==NULL){
printf("error opening file");
exit(0);
}
fread(mat,sizeof(int)*M*M,1,file);
fclose(fichier);
}
其中M是常数。
同样,当我在程序的相同使用过程中存储/加载多个时间时,它会完美工作
对不起我不是英语使用者的错误
答案 0 :(得分:2)
如前所述,该问题缺少关键要素,无法进行全面分析或完整答案。但是根据显示的内容,这里有一些建议:
1) 无法绝对确定您的细分错误的原因,因为您的帖子中缺少某些内容。但是,考虑到它有时起作用,而不是其他起作用,这表明 undefined behavior 发挥了作用。如果我要猜测未定义行为的根源,那就是您正在传递双指针变量int **mat
,而只需要一个指针变量int *mat
(请参阅{{1的原型}}),进一步使我相信fread()
的内存未正确创建。我建议更改:
mat
到
void Loading(int mat**) // double pointer is not needed here
(请参见下面 3中void Loading(unsigned int mat*) //and memory allocation method adjusted accordingly.
的原因。)
2) 函数unsigned
的原型为:
fread()
在您的通话中:
size_t fread (void *Buffer, size_t Element_Size, size_t Number_of_Elements, FILE *Stream);
参数2和3似乎相反。应该写成:
fread(mat,sizeof(int)*M*M,1,file);
3) 为什么在处理二进制数据时fread(mat, sizeof(unsigned int), M*M, file);
和unsigned int
相对应:
int
类型作为< em> reasons listed here 。 答案 1 :(得分:1)
您有一个指向矩阵int **mat
的缓冲区的指针。
问题是,这并不指向内存中的单个连续位置。
int mat**
是一个指向int的指针数组的指针。这是一个应该在内存中包含更多指针的位置。然后每个(int*
)都应指向不同的数组,这些数组最终将包含整数数组。
基本上,您使用命令读取将整个数据写入指针数组。也许您根本没有足够的空间来存储数据。即使您愿意,也需要另一种指针。
如果有一个连续数组,则可以使用int *
指向它。然后,您可以通过计算索引来选择一些元素。
int *mtx = (int*) malloc(M*M*sizeof(int);
int x = 2, y = 3;
int index = y*M+x;
mtx[index] = 123; // write to matrix coordinates 2,3
您可以毫无问题地将fread与此类缓冲区一起使用,只需检查输入文件中矩阵元素的索引方式,也许x,y就被交换了。