我正在编写一个具有较大结构和较小结构的程序,较小的程序在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()
调用中转换返回,有时不会。 不需要石膏。