Сбой PIC32 (неверный указатель) при вызове malloc после использования free()
Я работаю над проектом, включающим PIC32MX220f032b, в котором мне нужно использовать динамическое выделение памяти для объявления неизвестного числа структур в связанном списке.
Звонки malloc и все работало нормально, пока я не продолжил удаление данных. Идея состоит в том, чтобы выделить несколько структур и заполнить их данными (некоторые с помощью указателей). В какой-то момент все известные структуры освобождаются и объявляются новые.
Первый тест с единственным распределением работал в течение трех раундов, пока он не исчерпал память (понятно). Но когда я реализую функцию для освобождения структур данных, malloc больше не работает. Это вызов функции сбивает рис и отправляет его в обработчик исключений с ошибкой указателя. Но я не могу понять, почему...
Я использую следующую структуру:
typedef struct image_element
{
unsigned char conditional;
unsigned char datafield;
unsigned char comparisonType;
unsigned char compareValue;
unsigned char *filename;
unsigned char active;
unsigned short xSize;
unsigned short ySize;
unsigned short xStart;
unsigned short yStart;
struct image_element *next;
}screen_image_element;
В коде я выделяю структуру и указатель на имя файла с помощью malloc:
screen_image_element *tempElement;
tempElement = (screen_image_element *) malloc(sizeof(screen_image_element));
char *tmp;
tmp = (char *) malloc(somevalue); //somevalue is known
// fill tmp with a string
(*tempElement).filename = tmp;
После того, как все выделено и использовано (примечание: все эти функции работают как шарм), я хочу освободить все поля данных и начать все сначала:
void deleteMenu()
{
screen_image_element *temp;
while (image_elements) //image elements is the first struct in the linked list at this point
{
temp = image_elements->next; //save the next pointer
free(image_elements->filename); // free the data behind the filename pointer
free(image_elements); //free the rest of the struct
image_elements = temp; // put the next struct as first and loop
}
}
Я не могу проверить функциональность этого, так как бесплатный не предоставляет никаких возвращаемых значений, насколько я знаю, и не может видеть текущее использование памяти. До этого момента картинка все еще работает. Но когда я пытаюсь снова выделить память, рис вылетает (обработчик исключений вызывается с причиной 0x07: неверный указатель). Кажется, проблема возникает из-за вызова функции malloc:
malloc(18);
не работает так же (так что нет ошибки в параметрах функции или что-то).
У вас есть идеи, что может быть причиной этого?