You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言中给数据结构赋值数组元素时触发段错误,求技术支持

问题分析与修复:哈希表字符赋值的段错误问题

核心错误点

你遇到的段错误根源是哈希表指针数组未初始化:

node* table[26];

这是个局部数组,在栈上分配空间后,里面的每个指针都是随机的野指针。当你执行tmp = table[index];后,tmp指向的是完全无效的内存地址,后续对tmp->word的赋值操作直接触发了非法内存访问,也就是段错误。

你尝试硬编码tmp->word = 'c';时的报错,本质还是同一个问题——tmp是野指针,不管赋值什么值,都属于非法内存操作。

其他隐藏问题

  1. 链表节点未分配内存:循环里直接试图修改tmp->word,但从来没有用malloc创建过任何node结构体实例,连表头节点都不存在。
  2. 循环逻辑混乱:for循环的递增条件是tmp = tmp->next,但初始的tmp是野指针,tmp->next更是无效地址,循环根本无法正确遍历。
  3. 卸载函数存在崩溃风险: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);
}

关键修改说明

  1. 初始化哈希表:用node* table[26] = {NULL};把所有指针初始化为NULL,明确表示链表为空。
  2. 创建节点内存:每次循环都用malloc分配新的node结构体,确保有合法的内存地址可以操作。
  3. 修正链表插入逻辑:用头插法(或尾插法)将新节点添加到哈希表对应的链表中,保证链表结构正确。
  4. 完善卸载函数:先判断current是否为NULL,避免空指针访问;从表头开始释放整个链表的所有节点。

内容的提问来源于stack exchange,提问作者Hunter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 01:00:58