Почему этот код работает и дает правильные результаты? - PullRequest
4 голосов
/ 26 августа 2011

У меня есть два файла, один называется N.bin, а другой - R.bin.После нескольких месяцев использования я просто заметил, что у меня там ошибка.Тем не менее, я думал, что система будет зависать из-за этого.Но сначала это не так, а во-вторых, это дает правильный результат.Вот код:

Пожалуйста, смотрите в строке 19, как я по ошибке перетек из Nfile, а не Rfile.

// Чтение файла N

1       long world_features_lSize;
2       FILE* NFile;
3       double* N;
4       NFile=fopen("N.bin","r+b");
5   
6       fseek (NFile , 0 , SEEK_END);
7       lSize = ftell (NFile);
8       fseek (NFile , 0 , SEEK_SET);
9       N = (double*) malloc (sizeof(double)*lSize);
10      result = fread (N,1,lSize,NFile);
11      fclose(NFile);
    ////////////////// Read R

12      FILE* RFile;
13      double* R;
14      RFile=fopen("R.bin","r+b");

15      fseek (RFile , 0 , SEEK_END);
16      lSize = ftell (RFile);
17      fseek (RFile , 0 , SEEK_SET);
18      R = (double*) malloc (sizeof(double)*lSize);
19      result = fread (R,1,lSize,NFile);
20      fclose(RFile);

Пожалуйста, сообщите мне, почемуэтот код работает !!

1 Ответ

6 голосов
/ 26 августа 2011

Это, вероятно, связано с тем, как библиотеки времени выполнения C обрабатывают распределение памяти.fopen неправильно размещает буфер, так как возвращает объект FILE *.fclose освобождает буфер.Последующий fopen будет размещать буфер того же размера, что и раньше, и он просто возвращал ту же память, что и предыдущий free освобожденный.Если вы сравните значения указателей R и N, они будут одинаковыми.

Обратите внимание, что если бы вы выполнили какое-либо выделение \ освобождение памяти между строками 11 и 14, система потерпела бы крах.Кроме того, в зависимости от того, как работает отладчик, и времени выполнения, функция free иногда может быть настроена так, чтобы не использовать повторно освобожденную память.

Чтобы предотвратить подобные ошибки в будущем, всегда делайте следующее:

fclose (handle);
handle = 0; // so you get a null pointer error if you accidentally use it again
...