【问题标题】:How to properly allocate and free memory from 2D array within array list within struct?如何在结构内的数组列表中正确分配和释放二维数组的内存?
【发布时间】:2020-05-10 08:41:28
【问题描述】:

我正在编写一个程序,它有一个较大的结构和一个较小的结构,较小的结构包含 Friends 中二维数组的索引 0 中的人的朋友的名字。我从头开始写了几次,它总是给我 seg fault 或Thread 1: EXC_BAD_ACCESS (code=1, address=0x0)

这是我的结构:


【问题讨论】:

  • 请贴出所有相关代码。 expandBig 是做什么的? expandFriends 是做什么的?请发布minimal reproducible example。请将所有代码放在一个大代码块中,以便于复制。
  • add2people(People * people, char * val),添加的两个人是谁?
  • 好友中没有“二维数组”。

标签: c arrays struct malloc free


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2016-03-15
    • 1970-01-01
    • 1970-01-01
    • 2018-10-05
    • 1970-01-01
    • 2011-11-05
    • 1970-01-01
    • 2016-01-08
    • 2011-05-16
    相关资源
    最近更新 更多