LINUX.ORG.RU

Ошибки в работе функции, в которой вызывается malloc()

 , ,


0

1

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

static struct track_info* medialib_get_track_info (const char *filename) {
	TagLib_File *file = taglib_file_new_type(filename, TagLib_File_MPEG);
	TagLib_Tag *tag = taglib_file_tag(file);

	struct track_info *info = malloc(sizeof(*info));
	info->title = taglib_tag_title(tag);
	info->artist = taglib_tag_artist(tag);
	info->album = taglib_tag_album(tag);
	info->genre = taglib_tag_genre(tag);
	info->year = taglib_tag_year(tag);
	info->trackno = taglib_tag_track(tag);
	/*
	unsigned char *title = taglib_tag_title(tag);
	unsigned char *artist = taglib_tag_artist(tag);
	unsigned char *album = taglib_tag_album(tag);
	unsigned char *genre = taglib_tag_genre(tag);
	unsigned int year = taglib_tag_year(tag);
	unsigned int trackno = taglib_tag_track(tag);
	*/

	/*info->title = malloc(sizeof(*info->title) * strlen(title));
	info->artist = malloc(sizeof(*info->artist) * strlen(artist));
	info->album = malloc(sizeof(*info->album) * strlen(album));
	info->genre = malloc(sizeof(*info->genre) * strlen(genre));*/

	/*strcpy(info->title, title);
	strcpy(info->artist, artist);
	strcpy(info->album, album);
	strcpy(info->genre, genre);
	info->year = year;
	info->trackno = trackno;*/

	//taglib_tag_free_strings();
	taglib_file_free(file);

	return info;
}

Так — работает. А если членам структуры не присваивать непосредственно значения, возвращаемые функциями чтения тегов, а выделять память через malloc() и потом копировать туда эти значения (закомментированная часть кода), то прога начинает рандомно крашиться, вылетать ошибки сегментирования, шины, invalid fastbin entry (free) и т.д. Почему так?


Ответ на: комментарий от PamidoR

strlen считает байты, ей пофиг кодировки. Конкретно в этом коде проблемы на первый взгляд нет, нужно смотреть отладчик, хотя бы бэктрейс с места падения.

staseg ★★★★★
()
Ответ на: комментарий от staseg

А проблема таки есть похоже. strlen дает число байт до нулевого. strcpy очевидно копирует и нулевой байт тоже. При маллоке нужно делать +1.

staseg ★★★★★
()
Ответ на: Ванга-мод от gh0stwizard

taglib_file_free(file);

А тут нет попытки освободить память, которую вы выделяете сами под строки?

andreyu ★★★★★
()
Ответ на: комментарий от andreyu

Нет, для этого там есть taglib_tag_free_strings(), а эта функция просто закрывает файл.

PamidoR
() автор топика
Последнее исправление: PamidoR (всего исправлений: 1)
Ответ на: комментарий от PamidoR

А, и ещё. sizeof возвращает размер в char'ах, так что sizeof(char) всегда 1, даже если char занимает несколько байт.

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

sizeof возвращает размер в байтах:

5.3.3 Sizeof
The sizeof operator yields the number of bytes in the object representation of its operand.

, но:

sizeof(char), sizeof(signed char) and sizeof(unsigned char) are 1.

Shadow1251
()
Ответ на: комментарий от tailgunner

В чём профит таких больших байтов? Типа чтоб больше данных от сигнала уместилось в одном, что ли?

PamidoR
() автор топика
Ответ на: комментарий от Shadow1251

Да, я путаю восьмибитные байты с байтами из стандарта Си.

i-rinat ★★★★★
()
Ответ на: комментарий от anonymous

где сказано что там БАЙТ 32 битный?

Дай определение байта. В посте, на который я отвечал, было такое: «The sizeof operator yields the number of bytes in the object representation of its operand»; sizeof(char) == 1 на NM6403, но при этом char занимает 32 бита. Итак, каково твое определение «байта»?

tailgunner ★★★★★
()
Ответ на: комментарий от PamidoR

В чём профит таких больших байтов?

Без понятия. Подозреваю, что это позволяет сэкономить какие-то копейки за счет упрощения процессора процессора.

Типа чтоб больше данных от сигнала уместилось в одном, что ли?

Точно нет. Это может зависеть от ширины регистра, но не от размера минимальной адресуемой единицы.

tailgunner ★★★★★
()
Последнее исправление: tailgunner (всего исправлений: 1)
Ответ на: комментарий от tailgunner

Дай определение байта.

it is the smallest addressable unit of memory (с)

на сколь вижу в sdk там есть вполне себе uint8_t, который много меньше 32 бит.

anonymous
()
Ответ на: комментарий от anonymous

Дай определение байта.

it is the smallest addressable unit of memory (с)

На NM6403 это 32 бита.

на сколь вижу в sdk там есть вполне себе uint8_t, который много меньше 32 бит.

Тогда конечно.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

процессора процессора

У тебя получилось выразить всю суть современных процессоров в одной фразе.

i-rinat ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.