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

C语言中无法访问动态分配的结构体字符指针问题

C语言中无法访问动态分配的结构体字符指针问题

嗨,我看了你贴的哈希表代码片段,能感觉到你在动态分配结构体和字符指针这块遇到了麻烦,先帮你把现有代码整理成规范格式,再梳理下问题和解决思路~

整理后的代码

hashmap.h

#ifndef HASHMAP_H
#define HASHMAP_H

typedef struct HashMapNode HashMapNode;

struct HashMapNode {
  char *key;
  int  value;
  HashMapNode *collision;
};

typedef struct {
  int size;
  HashMapNode **map;
} HashMap;

HashMap *hashmap_new(size_t size);
HashMapNode *hashmap_node_new(HashMapNode *node);

#endif

hashmap.c

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include "hashmap.h"

HashMapNode *hashmap_node_new(HashMapNode *node){
  
  node = malloc(sizeof(HashMapNode));
  // 检查malloc是否成功,避免空指针访问
  if (node == NULL) {
      perror("Failed to allocate HashMapNode");
      return NULL;
  }

  node->key       = NULL;
  node->value     = 0;
  node->collision = NULL;

  return node;
};

HashMap *hashmap_new(size_t size){

  HashMap *hash_map = malloc(sizeof(HashMap));
  if (hash_map == NULL) {
      perror("Failed to allocate HashMap");
      return NULL;
  }

  hash_map->size = size;
  hash_map->map  = malloc(sizeof(HashMapNode*) * size);
  if (hash_map->map == NULL) {
      perror("Failed to allocate map array");
      free(hash_map); // 已分配的内存要释放,避免泄漏
      return NULL;
  }

  // 必须初始化每个桶为NULL,否则是野指针
  for (int i = 0; i < hash_map->size; i++) {
      hash_map->map[i] = NULL;
  }

  return hash_map;
};

问题分析与解决思路

我先针对你提到的「无法访问动态分配的结构体字符指针」问题,结合代码里的坑逐一说明:

  • hashmap_node_new的参数冗余问题:你现在的函数参数是HashMapNode *node,但函数里直接给它重新分配了内存,这个参数完全没用,还容易让人误解是要传入一个节点来初始化。建议改成无参函数HashMapNode *hashmap_node_new(void),调用时直接HashMapNode *new_node = hashmap_node_new();就好。

  • 字符指针key的正确赋值方式:你现在把key初始化为NULL,后续如果直接给它赋值栈上的字符串(比如node->key = "temp_key";或者指向局部变量的指针),当局部变量销毁后,再访问node->key就会触发未定义行为(比如野指针、乱码)。正确的做法是给key动态分配内存:

    // 用strdup(POSIX标准,方便快捷)
    node->key = strdup("my_key");
    // 兼容C标准的写法(自己手动分配)
    const char *src = "my_key";
    node->key = malloc(strlen(src) + 1); // +1是给字符串结束符留位置
    if (node->key == NULL) {
        perror("Failed to allocate key");
        free(node); // 分配失败要释放已创建的节点
        return NULL;
    }
    strcpy(node->key, src);
    
  • 内存分配的错误处理:你原来的代码没检查malloc的返回值,如果内存分配失败,后续访问空指针会直接崩溃。我在整理后的代码里加了检查,并且在分配map数组失败时,会先释放已经分配的HashMap结构体,避免内存泄漏。

  • map数组的初始化:你原来的for循环没写完,这里必须把每个桶(hash_map->map[i])初始化为NULL,不然这些指针是随机的野指针,后续判断桶是否为空、遍历链表时都会出问题。

备注:内容来源于stack exchange,提问作者h0ax

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.15 12:49:50