массив пустых указателей: valgrind дает неверный размер записи 8 - PullRequest
0 голосов
/ 11 апреля 2019

В CI нравится использовать анонимные массивы с помощью указателей void, но при отладке происходит повреждение памяти.Когда я использую valgrind, он рассылает упомянутое сообщение.

Честно говоря, я понятия не имею, что попробовать, поскольку это довольно экзотическая ситуация.

struct list_t {                                                                 
    void* first;                                                                
    void** elements;                                                            
    void* last;                                                                                                                                                                                                                                                                                                                

    unsigned int max_number_of_elements;                                        
    unsigned int number_of_elements;                                            

    unsigned int counter;                                                       
    void* element_current;                                                      
};
typedef struct list_t list;                                                     
typedef list* List; 
List list_create(                                                               

) {                                                                             
    List list = malloc(sizeof(list));                                                                          

    list->elements = (void**)malloc(sizeof(void*) * 16 );                                                                          

    ...                                             

    return list;                                                                
}

PS: Почему это былопомечены как дубликаты, поскольку на этот вопрос нет четкого ответа ни на один, даже отдаленно связанный вопрос?

1 Ответ

0 голосов
/ 11 апреля 2019

Я вижу, что не так.Список list создает list_t * и назначает ему выделенную память.Однако sizeof (list) выделяет достаточно памяти только для указателя.Ваш компилятор выбирает размер list_t *, а не размер list_t.Что означает, что строка перед ошибкой является проблемой.Измените его на:

List list = (void*)malloc(sizeof(list_t));

И тогда оно должно работать.Имя локального указателя скрывает имя структуры и поэтому выбирает неправильный размер для выделения.

...