我应该在什么情况下使用malloc?我很困惑应该在C中使用动态分配

时间:2012-03-25 11:59:30

标签: c malloc dynamic-memory-allocation

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

3 个答案:

答案 0 :(得分:6)

通常在C中使用动态分配有三种方法:

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

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

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

答案 1 :(得分:0)

malloc通常在编译时未知空间要求时使用,或者当您需要该对象超出其创建范围时仍然存在。

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

但是如果你想要的东西就像一个多维数组(在能够像x[i][j]这样的索引的意义上),直到运行时才知道维度,你需要涉及{{1}某处。

答案 2 :(得分:0)

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

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 ++使这个更多更容易和更安全)。