void指针数组:valgrind给出无效的写入大小8

时间:2019-04-11 02:17:19

标签: c arrays pointers valgrind

在C语言中,我喜欢通过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 :(得分:0)

我知道怎么了。列表列表创建一个list_t *并为其分配分配的内存。但是,sizeof(list)仅为指针分配了足够的内存。您的编译器选择的是list_t *的大小,而不是list_t的大小。这意味着错误之前的行是问题所在。将其更改为:

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

然后它应该工作。本地指针名称隐藏了结构名称,因此选择了错误的大小来分配。