C 试图访问二进制文件时出现分段错误

C 试图访问二进制文件时出现分段错误,c,file,segmentation-fault,C,File,Segmentation Fault,我的程序将矩阵存储在二进制文件中,当我在使用程序的过程中尝试“加载”它们时,一切都很正常 然而,当我关闭程序并在以后使用它时,不可能访问相同的文件,我会得到一个分段错误(内核转储)错误 下面是“加载”矩阵的函数: void Loading(int mat**){ char* name = malloc(sizeof(char)*20); printf("Enter name of the file"); scanf("%s",name); FILE* file=fopen(nam

我的程序将矩阵存储在二进制文件中,当我在使用程序的过程中尝试“加载”它们时,一切都很正常

然而,当我关闭程序并在以后使用它时,不可能访问相同的文件,我会得到一个分段错误(内核转储)错误

下面是“加载”矩阵的函数:

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是一个常数

同样,当我在相同的程序使用过程中存储/加载多个时间时,它也能完美地工作


对不起,我不是说英语的人,你有一个指向matrix
int**mat
缓冲区的指针。 问题是,这并不指向内存中的单个连续位置。
int mat**
是指向指向int的指针数组的指针。这是内存中的一个位置,应该包含一个接一个存储的多个指针。然后它们中的每一个(
int*
)都应该指向不同的数组,这些数组最终将包含整数数组

基本上,您可以使用命令fread将整个数据写入指针数组。也许你根本没有足够的空间来存储你的数据。即使你愿意,你也需要另一种指针。 如果有一个连续数组,可以使用
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是交换的。

您有一个指向矩阵
int**mat
缓冲区的指针。 问题是,这并不指向内存中的单个连续位置。
int mat**
是指向指向int的指针数组的指针。这是内存中的一个位置,应该包含一个接一个存储的多个指针。然后它们中的每一个(
int*
)都应该指向不同的数组,这些数组最终将包含整数数组

基本上,您可以使用命令fread将整个数据写入指针数组。也许你根本没有足够的空间来存储你的数据。即使你愿意,你也需要另一种指针。 如果有一个连续数组,可以使用
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是交换的。

如前所述,问题是缺少关键元素,无法进行全面分析,也无法给出完整答案。但根据所示内容,以下是一些建议:

1)由于您的文章中缺少一些片段,因此无法绝对确定您的分段错误的原因。然而,考虑到它有时起作用,而其他的则不起作用,这表明它正在发挥作用。如果我要猜测未定义行为的来源,那就是您正在传递一个双指针变量
int**mat
,而只需要一个单指针变量
int*mat
(请参见下面的
fread()
原型),进一步使我相信
mat
的内存没有正确创建。我建议改变:

void Loading(int mat**) // double pointer is not needed here

(请参见下文第3节中未签名的原因。)

2)函数
fread()的原型是:

size_t fread (void *Buffer, size_t Element_Size, size_t Number_of_Elements, FILE *Stream);
在您的通话中:

fread(mat,sizeof(int)*M*M,1,file);
论据2和3似乎相反。或许应该写下:

fread(mat, sizeof(unsigned int), M*M, file);
3)为什么使用二进制数据时使用
unsigned int
verses
int

  • 您的帖子没有明确说明数据是如何写入文件的,也没有明确说明数据的格式,但一般来说,在处理二进制数据时,最好使用
    无符号的类型
    
如前所述,该问题缺少进行全面分析的关键要素,也没有完整的答案。但根据所示内容,以下是一些建议:

1)由于您的文章中缺少一些片段,因此无法绝对确定您的分段错误的原因。然而,考虑到它有时起作用,而其他的则不起作用,这表明它正在发挥作用。如果我要猜测未定义行为的来源,那就是您正在传递一个双指针变量
int**mat
,而只需要一个单指针变量
int*mat
(请参见下面的
fread()
原型),进一步使我相信
mat
的内存没有正确创建。我建议改变:

void Loading(int mat**) // double pointer is not needed here

(请参见下文第3节中未签名的原因。)

2)函数
fread()的原型是:

size_t fread (void *Buffer, size_t Element_Size, size_t Number_of_Elements, FILE *Stream);
在您的通话中:

fread(mat,sizeof(int)*M*M,1,file);
论据2和3似乎相反。或许应该写下:

fread(mat, sizeof(unsigned int), M*M, file);
3)为什么使用二进制数据时使用
unsigned int
verses
int

  • 您的帖子没有明确说明数据是如何写入文件的,也没有明确说明数据的格式,但一般来说,在处理二进制数据时,最好使用
    无符号的类型
    
请正确缩进代码,使其可读。可读代码对您基本上是有好处的。问题很可能出现在调用
加载的代码中,而您没有显示该代码<代码>加载
看起来或多或少是正确的。顺便说一句:
(int-mat**)
不是C,应该是
(int-mat**)
?请出示真实代码。还要阅读以下内容:要回答这个问题,我们至少需要查看编写文件的代码。最好同时显示数组id在读写两种情况下是如何分配的。请复制/粘贴真实代码。@Ryker:“否则,这似乎是一个写得相当好的问题”I对象,上下文缺失。散文是不够的,我们需要看到代码,否则会有太多的猜测。请注意