在程序生命周期中使用malloc

在程序生命周期中使用malloc,c,malloc,C,Malloc,通用条款4.4.4 c89 我一直想在项目生命周期中使用malloc作为范围 但我只是想知道我的想法是否是最佳实践。例如,我在main中初始化了结构的一个实例。创建创建和销毁两个函数。我只是想知道这样做是否正确 下面我有一些基本代码 非常感谢你的建议 typedef struct Network_dev_t { size_t id; char *name; } Network_dev; Network_dev* create_network_device(Network_dev

通用条款4.4.4 c89

我一直想在项目生命周期中使用malloc作为范围

但我只是想知道我的想法是否是最佳实践。例如,我在main中初始化了结构的一个实例。创建创建和销毁两个函数。我只是想知道这样做是否正确

下面我有一些基本代码

非常感谢你的建议

typedef struct Network_dev_t {
    size_t id;
    char *name;
} Network_dev;

Network_dev* create_network_device(Network_dev *network)
{
    network = malloc(sizeof *network);
    if(network == NULL) {
        return NULL;
    }    
    return network;
}

void do_something(Network_dev *network)
{
    /* Do something with the network device */
}

void destroy_network_device(Network_dev *network)
{
    free(network);
}

int main(void)
{
    Network_dev *network = NULL;

    network = create_network_device(network);

    /* Do something with the network device */
    do_something(network);

    destroy_network_device(network);

    return 0;
}
  • 最好在同一功能中分配内存和释放内存。就像在同一个函数中打开和关闭文件一样。您可以通过在main()函数中创建和销毁网络_dev来实现这一点,这很好。这使得确认所有malloced位置也被释放变得容易
  • 最好是尽可能晚地处理一些事情,并尽快释放它。也就是说,保持内存的时间尽可能短。如果您的程序的任务是对网络开发者做一些事情,那么您做得很好。如果您的程序执行许多其他操作,则应在malloc()之前或free()之后执行
    • 看起来不错

      关于
      create\u network\u device

      Network_dev* create_network_device(Network_dev *network)
      
      不需要传入指针;我宁愿使用
      Network\u dev*创建网络设备(void)

      如果不是真的需要,则使用
      ;如果malloc失败,则函数末尾的
      返回网络
      返回NULL
      相同

          if(network == NULL) {
              return NULL;
          }
      
      如果分配成功,您可能希望确保结构成员在此处于已知状态

          /* if (network) {       */
          /*     id = 0;          */
          /*     name = NULL;     */
          /* }                    */
      
          return network;
      }
      

      这个代码在我看来很好。我同意pmg的观点,即您的
      创建网络设备
      需要一些工作。为了把他说的话放在一起,让事情更清楚,下面是我将如何编写函数:

      Network_dev *create_network_device()
      {
          Network_dev *network = malloc(sizeof(*network));
          if (network) {
              network->id = 0;
              network->name = NULL;
          }
          return network;
      }
      

      我知道这对大多数人来说都是一个哑巴,但关于你的第二个子弹,这并不意味着你应该仅仅因为可以就在紧循环中移动malloc()/free()对。是的,你是正确的。实际上,在我的代码中,我初始化了成员。然而,为了简单起见,我省略了这一点。谢谢
      Network_dev *create_network_device()
      {
          Network_dev *network = malloc(sizeof(*network));
          if (network) {
              network->id = 0;
              network->name = NULL;
          }
          return network;
      }