ошибка сегмента после разбора unsigned char на указатель int - PullRequest
0 голосов
/ 23 сентября 2018

Я столкнулся с проблемой при попытке прочитать двоичный файл фиксированного размера.Приведенный ниже код возвращает ошибку сегментации непосредственно перед закрытием файла.Чего я хочу добиться, так это вернуть int-указатель обратно в основную функцию.

Файл представляет собой необработанное изображение в градациях серого со значениями от 0 до 255, поэтому я использую unsigned char.

Как правильно преобразовать и назначить неподписанный символ в *int?

Любая помощь будет приветствоваться!

void readBinaryFile(char *filename, int *in){

    FILE *file;
    long length;
    unsigned char *imagen;

    int c;

    file = fopen(filename, "rb");
    fseek(file,0,SEEK_END);
    length = ftell(file);

    imagen = (unsigned char *) malloc(length);
    fseek(file, 0, SEEK_SET);
    fread(imagen, length,  1 , file);

    int cont;
    //c+4: file contains values from 0 to 255 
    for(c=0,cont=0;c<length;c=c+4,cont++){
       in[cont] = (unsigned char) imagen[c];         
    }


    for(cont=0;cont<length/4;cont++){
       printf("%d",(int) in[cont]);
    }

    fclose(archivo);
    free(imagen_buffer);
}

void main(int argc, char **argv){

    int *in;           
    int fixed_size = 784;
    in = (int *) malloc((fixed_size)*(fixed_size));
    readBinaryFile("test.raw", in);

    int c;

    for(c=0;c<((fixed_size)*(fixed_size));c++){
        printf("%d", (unsigned char) in[c]);
    }           
}

1 Ответ

0 голосов
/ 23 сентября 2018

int *in;

указывает in на int.

Это

 in = (int *) malloc((fixed_size)*(fixed_size));

выделяет in 784 * 784 = 614656байт.

  1. Вам нужно 784 * 784 int с.
  2. int требуется sizeof (int) байт, что по определению вполне может быть и чаще всего больше , чем 1.

Из 1. и 2. выше может быть выведено, что для 784 * 784 int нужно больше затем 784 * 784 байта.

Так что измените

in = (int *) malloc((fixed_size)*(fixed_size));

, чтобы быть

in = (int *) malloc((fixed_size)*(fixed_size) * sizeof (int));

или даже лучше и безопаснее с меньшим уровнем шума,

in = malloc(fixed_size*fixed_size * sizeof *in);

, потому что

  • в C существуетнет необходимости приводить void* (который возвращает malloc()).
  • скобки вокруг fixed_size бесполезны.
  • с использованием sizeof *in возвращает то же самое, что и sizeof (int), но"выжил бы", если бы вы изменили int * in, чтобы стать, например, unsigned * in.

Кроме того, во время чтения вы должны следить за тем, чтобы не читать больше 784 * 784 char,иначе память, выделенная для int, будет переполнена, что в свою очередь вызвало печально известное неопределенное поведение.

...