【问题标题】:In what situation am I supposed to use malloc? I'm confused by when dynamic allocation should be used in C在什么情况下我应该使用malloc?我对什么时候应该在 C 中使用动态分配感到困惑
【发布时间】:2012-03-25 11:59:29
【问题描述】:

如果我想创建一个二维数组,其尺寸由用户输入指定,我不能在主函数中按顺序执行此操作吗?一旦我通过使用 scanf 获得了维度,然后我创建一个具有这些维度的数组?据我了解,当运行时所需空间未知时,应该使用 malloc 。我不会知道运行时所需的空间,但我不必动态分配内存,它无论如何都会工作,对吧?也许我完全误解了一些东西。

【问题讨论】:

  • 我认为你的意思是“在编译时未知”。

标签: c malloc dynamic-memory-allocation


【解决方案1】:

在 C 中使用动态分配通常有三个原因:

  1. 直到运行时才知道大小(另一种选择是 VLA's,但这是 C99 并且有潜在危险,请参阅原因 2)。

  2. 堆栈的大小(很可能)太大,有堆栈溢出的风险。

  3. 对象需要在堆上存活,使其比“自动”存储的寿命更长。

【讨论】:

    【解决方案2】:

    malloc 通常在编译时时不知道空间需求时使用,或者当您需要对象在创建它的范围之外持续存在时。

    在 C99 中(与 C 的早期版本不同),您还可以在不使用 malloc 的情况下定义可变长度的一维数组。但是很多人consider then evil,因为没有办法捕捉到内存不足的情况。

    但是,如果您想要像多维数组一样的东西(在能够像 x[i][j] 那样对其进行索引的意义上)其中维度直到运行时才知道,您将需要在某处涉及 malloc

    【讨论】:

    • 关于你的第三个理由,int table[5][5]; 有什么问题?
    • @nightcracker:我的意思是在运行时不知道尺寸。我会澄清我的答案...
    【解决方案3】:

    以下是需要动态分配的典型示例:制作动态容器。由于您事先不知道元素的数量,因此每个元素必须动态分配。由于您在循环中填充容器,因此每个元素 必须 超出循环范围。这是最简单的“零一多”规则,其中的“多”部分立即需要动态分配:

    int value;
    node * my_list = NULL;
    
    while (get_one_more_input(&value) == SUCCESS)
    {
        node * elem = malloc(sizeof(node));
    
        elem->data = value;
        elem->next = my_list;
        my_list = elem;
    }
    

    这里的关键在于,实际的列表节点仅填充在内部读取输入数据的循环中,但显然它必须比该范围更长。因此,没有自动对象可以做到,因为它只能活到作用域的末尾,也没有静态元素可以做到,因为您无法事先知道循环迭代的 number 次。动态生命周期和存储管理是这里唯一的解决方案,这也是它的主要用途。

    在 C 语言中,您需要手动完成很多工作,因为动态数据结构是计算的核心。 C++ 通过将所有动态管理逻辑包装到隐藏的、可重用的代码中,使这些工作变得更容易和更安全,您永远不需要作为消费者查看(尽管它仍然在做完全相同的事情) )。

    【讨论】:

      猜你喜欢
      • 2010-12-30
      • 2021-09-16
      • 2011-07-26
      • 1970-01-01
      • 2011-12-27
      • 2020-09-26
      • 2019-07-12
      • 1970-01-01
      相关资源
      最近更新 更多