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
相关产品推荐
相关产品推荐

