从二进制文件读取时,循环在中途停止,直到那时一切都很好

When reading from binary file, loop stops midway, all good up till then

我正在尝试将 arr_size 个整数从二进制文件“file.bin”读取到动态数组 到达。文件中的第一个数字是 arr_size 值,可以正确读取。然后循环遍历 arr_size 个值,前 5 个值被正确读取,然后程序突然停止并且 fscanf 之后的 printf 不打印任何内容。没有错误或警告,什么都没有。 这就是我调用函数的方式:

loadFromFile(&size, &m2);

函数本身:

void loadFromFile (int *arr_size, int **arr) {
   FILE *file = fopen("file.bin", "rb");
   fscanf(file, "%d", arr_size);
   (*arr) = (int *) malloc ((*arr_size) * sizeof(int));
   for (int i = 0; i < *arr_size; i++) {
       printf("i=%d, ", i);
       fscanf(file, "%d", arr[i]);
       printf("%d \n", *arr[i]);
   }
   fclose(file);
}

输出是这样的:

i=0, 928
i=1, 604
i=2, 113
i=3, 37
i=4, 193
i=5,

我认为问题出在您的指针访问上:

(*arr) = (int *) malloc ((*arr_size) * sizeof(int));

arr 被假定为指向一个类型为 int* 的变量。这会将 *arr 设置为分配的数组。

fscanf(file, "%d", arr[i]);

这将 arr 视为指针数组,而不是指向数组指针的指针。

printf("%d \n", *arr[i]);

这与上面的scanf()调用是一致的。但是,它们都越界访问内存,在调用方的 int* arr 变量之后,而不是使用新分配的数组。

您需要对 scanf() 使用 &(*arr)[i],对 printf() 使用 (*arr)[i]。或者实际上使其可读且不易出错,这样写:

int *dest = malloc ((*arr_size) * sizeof(int));
*arr = dest;
fscanf(..., &dest[i]);
printf(..., dest[i]);