Ошибка выделения памяти с C? Код работает, когда определена неиспользуемая переменная; иначе вылетает - PullRequest
0 голосов
/ 25 июня 2019

Я начинающий программист C и полностью застрял в отладке программы, использующей пакет CFITSIO [заранее извините, если я неправильно понял терминологию, приведенную ниже].У меня есть две подгонки, в которых я читаю: 1. "BFmask.fits", 2. "DFmask.fits".Это два файла, которые имеют элементы 1 или 0.

Они определены как указатели двойной точности, как показано ниже: double * maskdark, * maskbright;

Распределение памяти выглядит следующим образом:

maskdark=malloc(size*sizeof(double)); //dark mask
maskbright=malloc(size*sizeof(double)); //bright mask

, где «размер» - это длинная переменная со значением 490000

ПРОБЛЕМА: Когда я выполняю программу, онаочевидно, не правильно читает в BFmask.fits или DFmask.fits (то есть не правильно читает в записях для maskbright или maskdark).

ОДНАКО, когда я объявляю третью переменную с именем 'mask' (т.е. double * mask;), тогда программа ДЕЙСТВИТЕЛЬНО выполняется.

  1. Какова причина и решение этой проблемы?
  2. Как избежать подобных в будущем?

Я проверял десятки разчтобы убедиться, что эта переменная не используется нигде в программе.Это не имеет смысла для меня.

 #include <stdio.h>

 //For declaration of open, close
 #include <sys/stat.h>
 #include <fcntl.h>
 #include <math.h>
 #include <unistd.h>
 #include <time.h>
 //GSL Matrix STuff
 #include <gsl/gsl_vector.h>
 #include <gsl/gsl_math.h>
 #include <gsl/gsl_matrix.h>
 #include <gsl/gsl_eigen.h>
 #include <gsl/gsl_blas.h>
 //CFITSIO
 #include <fitsio.h>
int main ()
{
long sizetotdm,cmwfsbrightindex,cmwfsdarkindex;
long size,sizex,sizey;
double *maskdark,*maskbright;
//double *mask; //if I uncomment this, then the program works   properly somehow
fitsfile *fptr;
float nullval;
int  status, anynull;

cmwfsbrightindex=0;
cmwfsdarkindex=0;
sizex=700; sizey=700; size=sizex*sizey;

/* Define Masks for Dark Field and Bright Field */
maskdark=malloc(size*sizeof(double)); //dark mask
maskbright=malloc(size*sizeof(double)); //bright mask

/* Read in Dark and Bright Field Mask files */
sprintf(s_file,"./06_21_19_mask/BFmask.fits");
fits_open_file(&fptr,s_file,READONLY,&status);
   fits_read_img(fptr,TDOUBLE,1,size,&nullval,maskbright,&anynull,&status);


sprintf(s_file,"./06_21_19_mask/DFmask.fits");
fits_open_file(&fptr,s_file,READONLY,&status);
fits_read_img(fptr,TDOUBLE,1,size,&nullval,maskdark,&anynull,&status);

for (i=0;i<size; i++)
 {
  if (*(maskbright+i)==1)
   {
     cmwfsbrightindex+=1;
      }
  if (*(maskdark+i)==1)
   {
     cmwfsdarkindex+=1;
      }
  }

printf("the number of pixels is %ld %ld     \n",cmwfsbrightindex,cmwfsdarkindex);
}

Результаты должны быть ...

the number of pixels is 24212 24952 //this happens when I define an unused variable

Результаты будут ...

the number of pixels is 0 0  //this happens when I comment out the unused variable
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...