【问题标题】:How to malloc these structures? [closed]如何malloc这些结构? [关闭]
【发布时间】:2013-12-20 05:48:18
【问题描述】:
struct atom {
  int x;
  int y;
  int z;
  double mass;
};

struct molecule {
  struct atom *member;
  int natoms;
};

struct system {
  struct molecule *fragment;
  int nfrags
};

struct system sys;
sys.nfrags=get_number_of_fragments;
????

系统有一定数量的分子,每个分子都有一定数量的原子。我不知道如何分配这些东西。如果我先分配 sys.fragment ,似乎 sizeof(molecule) 是未定义的,因为我还没有定义原子的数量(那么它怎么会有大小呢?)。如果我尝试先定义原子数,如何指定要分配的片段?

我有一些函数可以返回任何分子/片段的原子数以及片段数,但我不知道从哪里开始。

【问题讨论】:

  • 也许值得看看可变大小数组是如何在 c 中实现的; `realloc' 是你的朋友。

标签: c gcc struct malloc sizeof


【解决方案1】:

malloc(sizeof(system))就这么简单

【讨论】:

  • 你是说我应该做类似 sys.fragment=(struct moluecule *)sizeof(system) 之类的事情?
  • 基本上。等等等等。但我可能会做的是设置另一个等于 sys.fragment 的变量,这样你就不会得到一个很长的令人困惑的语句
  • @Pinyaka 绝对不是!您正在将整数转换为那里的指针,当您尝试将任何内容放在那里时,这将非常失败。
  • @Quirliom 你是绝对正确的。我只是看了一眼声明,但错过了演员表。
【解决方案2】:

AFAIK sizeof(X) 不能“未定义”。在这个例子中,sizeof(molecule) 被很好地定义为存储一个分子实例所需的内存量:一个原子指针(注意:不是你可以放在这里的任何数组的大小,只是指针的大小)和一个诠释。因此,以第一种方式执行此操作并首先分配您的 sys.fragment 是完全可以的:

sys.fragment = malloc(sys.nfrag * sizeof(sys.fragment));

【讨论】:

  • 我会写成sys.fragment = malloc(sys.nfrag * sizeof sys.fragment);(注意确保乘法不会溢出)。
【解决方案3】:
sys.fragment = calloc(sys.nfrag, sizeof sys.fragmemt[0]);

sys.fragment = malloc(sys.nfrag * sizeof sys.fragment[0]);

当性能很重要时(但不要忘记检查溢出!)。

【讨论】:

    【解决方案4】:

    你基本上有一个:

    size = X;
    first = malloc(X * sizeof(First));
    first->second = malloc( N * sizeof(Second));
    

    等等

    【讨论】:

      猜你喜欢
      • 2018-12-22
      • 1970-01-01
      • 2012-08-31
      • 1970-01-01
      • 2017-03-08
      • 2015-01-05
      • 2020-12-14
      • 2021-10-01
      • 2022-12-05
      相关资源
      最近更新 更多