C语言中给数据结构赋值数组元素时触发段错误,求技术支持
问题分析与修复:哈希表字符赋值的段错误问题
核心错误点
你遇到的段错误根源是哈希表指针数组未初始化:
node* table[26];
这是个局部数组,在栈上分配空间后,里面的每个指针都是随机的野指针。当你执行tmp = table[index];后,tmp指向的是完全无效的内存地址,后续对tmp->word的赋值操作直接触发了非法内存访问,也就是段错误。
你尝试硬编码tmp->word = 'c';时的报错,本质还是同一个问题——tmp是野指针,不管赋值什么值,都属于非法内存操作。
其他隐藏问题
- 链表节点未分配内存:循环里直接试图修改
tmp->word,但从来没有用malloc创建过任何node结构体实例,连表头节点都不存在。 - 循环逻辑混乱:
for循环的递增条件是tmp = tmp->next,但初始的tmp是野指针,tmp->next更是无效地址,循环根本无法正确遍历。 - 卸载函数存在崩溃风险:
unload函数里直接访问current->next,如果current是NULL,会直接触发段错误;而且你只释放了table[index]->next,表头节点根本没被释放。
修复后的完整代码
#include <ctype.h> #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct node { struct node* next; char word; } node; void unload(node* current); int main(void) { // 初始化哈希表所有元素为NULL,避免野指针 node* table[26] = {NULL}; char buffer[5] = "Hello"; printf("%s\n", buffer); int index = tolower(buffer[0]) - 'a'; node* tmp = NULL; // 遍历缓冲区,逐个创建节点插入链表 for(int i = 0, n = strlen(buffer); i < n; i++) { // 分配新节点内存 node* new_node = malloc(sizeof(node)); if (new_node == NULL) { // 内存分配失败的处理 printf("Memory allocation failed\n"); // 先释放已分配的节点 unload(table[index]); return 1; } new_node->word = buffer[i]; new_node->next = NULL; // 头插法插入哈希表(也可以用尾插法) if (table[index] == NULL) { table[index] = new_node; tmp = table[index]; } else { tmp->next = new_node; tmp = new_node; } printf("%c\n", new_node->word); } // 释放整个链表的内存 unload(table[index]); return 0; } void unload(node* current) { // 先判断current是否为NULL,避免非法访问 if (current == NULL) return; if (current->next != NULL) { unload(current->next); } free(current); }
关键修改说明
- 初始化哈希表:用
node* table[26] = {NULL};把所有指针初始化为NULL,明确表示链表为空。 - 创建节点内存:每次循环都用
malloc分配新的node结构体,确保有合法的内存地址可以操作。 - 修正链表插入逻辑:用头插法(或尾插法)将新节点添加到哈希表对应的链表中,保证链表结构正确。
- 完善卸载函数:先判断
current是否为NULL,避免空指针访问;从表头开始释放整个链表的所有节点。
内容的提问来源于stack exchange,提问作者Hunter
相关产品推荐
相关产品推荐

