Я думаю, что ваши fread(3)
звонки неверны:
fread(&(bmpdata->ancho), sizeof((bmpdata->ancho)), 4, fichero);
Это просит прочитать 4*sizeof((bmpdata->ancho))
байт в int
. Я предполагаю, что sizeof((bmpdata->ancho))
возвращает 4
, так что я думаю, что вы набрасываетесь на несвязанную память этими двумя вызовами. Измените 4
на 1
- вы читаете только один элемент.
Вы никогда не используете num_bytes
; удали это. Неиспользуемый код делает размышления об используемом коде намного сложнее. :)
Вы выделяете в три раза больше памяти, чем вам необходимо:
pixel =
(rgb *) malloc(sizeof(rgb) * bmpdata->alto *
bmpdata->ancho * 3);
3
выглядит как попытка учесть каждый из красного, зеленого, синего в вашей rgb
структуре, но sizeof(rgb)
уже знает правильный размер структуры. (Это может быть 4
байт, для удобного выравнивания для 32-разрядных процессоров, или это может быть 12
байт, опять же для выравнивания (каждый char
на своей собственной 4
байтовой границе), или, может быть, даже 24
байты в 64-битных системах, которым действительно нравится работать с данными, выровненными по 8
границам байтов.)
И последнее, что я отмечу:
fread(pixel, 1, sizeof(rgb), fichero);
Поскольку компилятору C разрешено вставлять дыры в структуры, вы не можете предполагать, что формат на диске соответствует определению структуры в памяти. Вам нужно либо использовать атрибут GNU C extension __packed__
, либо прочитать данные из библиотеки или структур, предназначенных для формата bmp . Если это забавный проект для вас, то обязательно попробуйте маршрут __packed__
: если он работает, хорошо, если он не работает, надеюсь, вы сможете узнать, почему нет, и переписать свой код, чтобы загрузить каждый элемент структурировать вручную. Если вы просто пытаетесь получить что-то, что может правильно анализировать растровые изображения, вы можете попытаться найти некоторые заранее написанные библиотеки, которые уже правильно анализируют изображения.
(И да, ОЧЕНЬ ВАЖНО для правильного разбора изображения; CVE содержит список искаженных образов эксплойтов , которые позволяют злоумышленникам контролировать программы, многие из них могут использоваться удаленно .)