繁体   English   中英

我应该在什么情况下使用malloc? 我对何时在C中使用动态分配感到困惑

[英]In what situation am I supposed to use malloc? I'm confused by when dynamic allocation should be used in C

如果我想创建一个二维数组,其维度由用户输入指定,我是否不能仅在main函数中按顺序执行此操作? 使用scanf确定尺寸后,我便可以使用这些尺寸创建数组了吗? 据我了解,应该在运行时不知道所需空间的情况下使用malloc。 我不会在运行时知道所需的空间,但是我不必动态分配内存,它无论如何都可以工作,对吗? 也许我完全误会了一些东西。

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

  1. 该大小直到运行时才知道(另一种替代方法是VLA ,但这是C99,可能有危险,请参见原因2)。

  2. 该大小(最有可能)对于堆栈而言太大,可能会导致堆栈溢出。

  3. 该对象需要驻留在堆上,从而使其寿命比“自动”存储更长。

当在编译时不知道空间需求 ,或者当您需要对象能够在其创建范围之外保留 ,通常使用malloc

在C99中(与C的早期版本不同),还可以定义长度可变的一维数组,而无需使用malloc 但是许多人认为邪恶 ,因为没有办法解决内存不足的情况。

但是,如果您想要一个像多维数组一样的东西(就象x[i][j]那样能够对其进行索引),而这些维直到运行时才知道,那么您将需要在某个地方使用malloc

这是动态分配需求的典型示例:制作动态容器。 由于您不知道元素的数量, 因此必须动态分配每个元素。 由于您是在循环中填充容器,因此每个元素都必须超过循环作用域。 这是“零一多”规则,其“多”部分立即需要动态分配:

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;
}

这里的症结在于,实际的列表节点仅填充读取输入数据的循环 ,但显然,它必须超出该范围。 因此,没有自动对象可以做,因为它只会活到范围的结束,也没有静态元素可以做的,因为你可以不知道循环迭代次数事前。 动态生命周期和存储管理是这里唯一的解决方案,而这正是它的主要目的。

在C语言中,您将手动进行很多操作,因为动态数据结构是计算的核心。 通过将所有动态管理逻辑包装到隐藏的,可重用的代码中,C ++可以使很多事情变得更加轻松和安全,而这些代码无需作为使用者使用(尽管它仍在做完全相同的事情)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM