Всем добрый вечер.
Имеем:
связанный список, например такой структуры:
typedef struct t_t_buffer_list_data {
uint8_t *data;
uint16_t data_len;
uint32_t id;
struct t_t_buffer_list_data *next;
} t_buffer_list_data;
И вторую структуру:
typedef struct {
t_buffer_list_data *first; //указатель на первую структуру в списке
t_buffer_list_data *last; // соответственно на последную
uint32_t count; //общее кол-во структур
} t_buffer_list_main;
Вторая структура для удобства, чтобы указатели и кол-во было упаковано. Определяется глобальная переменная для этого модуля:
buffer_list_main t_buffer_list_main;
Итак, в общем во всей работе с этими списками есть такая функция, которая в переменной buffer_list_main меняет значение указателя на последний элемент в списке:
t_buffer_list_data *buffer_list_add_item(t_buffer_list_data * last, uint8_t *data, uint16_t data_size, uint32_t id) {
t_buffer_list_data *buffer_list_data;
buffer_list_main.count++;
buffer_list_data = (t_buffer_list_data*)malloc(sizeof(t_buffer_list_data));
buffer_list_data->data = malloc(data_size);
buffer_list_data->next = NULL;
buffer_list_data->data_len = data_size;
buffer_list_data->session_id = session_id;
memcpy(buffer_list_data->data, data, data_size);
if (buffer_list_main.last != NULL) {
buffer_list_main.last->next = buffer_list_data;
}
return buffer_list_data;
}
НО! valgrind ругается на эту строчку:
buffer_list_main.last->next = buffer_list_data;
пишет:
Invalid write of size 8
at 0x40577F: buffer_list_add_item (buffer_list.c:53)
Там дальше и другие есть названия функций по списку...
но трабла именно в этом присвоении - коментил ругаться valgrind перестает.
В общем, решил убрать buffer_list_main и вынести из структуры указатели на первый и последний элементы, ругань прошла.
Может кто подскажет из-за чего такое происходит?
выравнивание делал на всякий случай.
Заранее благодарен!
И да система убунту 12.01
gcc 4,6,3.