如何为C语言结构体中的二级指针friends分配动态内存?
现有代码错误修正
首先你现有代码里有几个明显的语法和逻辑错误:
p->*friends是错误语法,二级指针成员访问直接写p->friends即可friend_count和max_friends是size_t类型的普通成员,不是指针,不需要用malloc分配内存,直接赋值即可,你写的malloc不仅完全多余,还会造成内存泄漏- 函数声明有返回值
person_t *,但你没有写return p返回创建的结构体指针 - 没有对
malloc的返回值做判空处理,一旦内存分配失败会触发空指针访问崩溃
friends二级指针的正确分配方式
struct person_s **friends本质是一个存储person_t*类型元素的动态数组,二级指针指向这个数组的首地址,分配逻辑如下:
- 初始化时先设定好友数组的初始容量,比如初始最多容纳4个好友
- 给数组分配内存,总大小 = 单个元素大小(
sizeof(person_t*)) * 初始容量 - 初始化
friend_count为0,max_friends为初始容量
正确的newperson函数参考代码:
#include <stdlib.h> #include <string.h> person_t *newperson(char *fn, char *ln, char *han, size_t initial_max_friends) { // 初始容量给默认值,比如默认是4 if (initial_max_friends == 0) initial_max_friends = 4; person_t *p = malloc(sizeof(person_t)); if (p == NULL) return NULL; // 分配失败直接返回 // 分配姓名字段,记得判空 p->fname = malloc(strlen(fn) + 1); if (p->fname == NULL) { free(p); return NULL; } strcpy(p->fname, fn); p->lname = malloc(strlen(ln) + 1); if (p->lname == NULL) { free(p->fname); free(p); return NULL; } strcpy(p->lname, ln); p->handle = malloc(strlen(han) + 1); if (p->handle == NULL) { free(p->lname); free(p->fname); free(p); return NULL; } strcpy(p->handle, han); // 分配friends动态数组 p->friends = malloc(sizeof(person_t*) * initial_max_friends); if (p->friends == NULL) { free(p->handle); free(p->lname); free(p->fname); free(p); return NULL; } p->friend_count = 0; p->max_friends = initial_max_friends; return p; }
后续添加好友的时候,如果friend_count等于max_friends,可以用realloc对p->friends扩容,通常扩容为原来的2倍即可,示例逻辑:
int add_friend(person_t *p, person_t *friend) { if (p == NULL || friend == NULL) return -1; // 容量不足先扩容 if (p->friend_count >= p->max_friends) { size_t new_max = p->max_friends * 2; person_t **new_friends = realloc(p->friends, sizeof(person_t*) * new_max); if (new_friends == NULL) return -1; // 扩容失败 p->friends = new_friends; p->max_friends = new_max; } p->friends[p->friend_count++] = friend; return 0; }
哈希表存储好友的方案评估
是否合适完全取决于你的业务场景:
- 如果你有高频的「判断某个用户是否是当前用户好友」的需求,哈希表O(1)的查找效率远高于动态数组的O(n)遍历,这种场景下用哈希表非常合适
- 如果你只需要批量遍历所有好友、不需要随机查找,动态数组的遍历效率更高,连续内存的缓存友好性远优于哈希表
- 如果使用哈希表存储好友,你可以直接替换掉原结构体里的
friends、friend_count、max_friends三个成员,改为存储哈希表结构体的指针即可
内容的提问来源于stack exchange,提问作者quiccode
相关产品推荐
相关产品推荐

