C语言哈希表初始化遇段错误、内存泄漏,求解析Valgrind报错
哈希表初始化代码的内存错误分析
核心错误点
- 全局数组不可赋值:
table是全局声明的指针数组node *table[N];,数组名属于常量指针,无法通过table = malloc(...)修改其指向,这是语法逻辑错误。全局数组本身已在静态存储区分配内存,无需额外调用malloc。 - 内存分配类型不匹配:即便忽略数组赋值错误,代码中
malloc(sizeof(node) * N)分配的是N个node结构体的内存,但table是node*类型数组,每个元素为指针,若要动态分配数组,正确大小应为sizeof(node*) * N。 - 野指针解引用:循环中
table[i]->next = NULL直接解引用table[i],此时table[i]是未初始化的野指针(或被错误覆盖为无效地址),访问其next字段会触发非法内存访问,导致段错误。
Valgrind报错含义解释
- "invalid size of 8":64位系统中指针大小为8字节,Valgrind检测到你分配/访问的内存块大小与实际所需的指针类型大小不匹配。代码错误地按
node结构体大小分配内存,而非指针大小,导致内存布局混乱,触发该提示。 - Segmentation Fault(段错误):因解引用未初始化/非法指针,程序访问了不属于自身的内存地址,触发系统内存保护机制。
- 内存泄漏:错误调用
malloc分配的内存未被释放,且由于table是全局数组,无法正确管理这块动态内存,导致内存无法回收。
修正方案
移除错误的malloc调用,直接初始化全局数组的每个元素为NULL:
void init_table() { for (int i = 0 ; i < N; i++) { table[i] = NULL; } }
内容的提问来源于stack exchange,提问作者underscore
相关产品推荐
相关产品推荐

