C语言 如何在结构内的数组列表中正确分配和释放 2D 数组的内存?



我正在编写一个具有较大结构和较小结构的程序,较小的程序在Friends中2D数组的索引0中保存该人的朋友的名字。我从头开始写了几次整件事,它一直给我带来 seg 错误或Thread 1: EXC_BAD_ACCESS (code=1, address=0x0).

这是我的结构:


expandBig()expandFriends()不会为新数据赋值。

看起来至少一个问题是名称分配。

friends->name[friends->size]expandFriends(friends)之后没有被赋值,所以strcpy()失败。

void addFriend(Friends * friends, char * val) {
if(friends->size == friends->cap)
expandFriends(friends);
strcpy(friends->name[friends->size], val);
....

考虑使用strdup()

// strcpy(friends->name[friends->size], val);
friends->name[friends->size] = strdup(val);

。并在InitializeFriends()

friend->name[i] = NULL;

像下面的代码审查起来很乏味
大小合适吗? IDK,现在必须跋涉到friend,找到它的类型。好的,这Friends. 现在查找Friends定义并查看成员char ** name。 好的,现在取消引用char **我们得到char *. 这匹配代码sizeof(char*),所以sizeof(char*)没问题。

friend->name = realloc(friend->name, sizeof(char*) * friend->cap);

节省时间。 代码为取消引用指针的大小,而不是类型。 这更容易正确编码、审查和维护。
大小合适吗?
是的,通过构造,sizeof *(friend->name)是合适的尺寸。

// friend->name = realloc(friend->name, sizeof(char*) * friend->cap);
friend->name = realloc(friend->name, sizeof *(friend->name) * friend->cap);
// People * ret = (People*)calloc(DEFAULT_CAP, sizeof(People));
People * ret = calloc(DEFAULT_CAP, sizeof *ret);

不清楚为什么代码有时会*alloc()调用中转换返回,有时不会。 不需要石膏。

最新更新