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() 调用中转换返回值,而有时却没有。不需要演员表。