c - 为什么你会想要在堆上有一个数组?

标签 c arrays memory dynamic

为什么你会想要在堆上有一个数组?我的教授给了我们两个理由:

  1. 将数组传递给函数,而不是传递一个副本
  2. 使数组在作用域之外存在

不能通过以下方式解决这两个问题:

  1. 将指针传递给堆栈上的数组
  2. 返回数组的值而不是数组本身(即使用复制构造函数)

谁能给我一个例子,说明堆中的数组必须在哪里使用?

最佳答案

堆中的数组用于使函数的作用域更长。仅当您不想稍后在先前的(上层)调用者中使用它时,将指针传递给堆栈上的数组才有效。而且你不能从函数返回一个数组,你可以返回一个指向数组的指针,但是如果它是在栈中分配的,那么函数返回后它会指向一个无效的内存位置。

第一个原因是错误的:数组从不通过复制传递。当你调用一个函数时,数组名总是衰减成指向它第一个元素的指针,正是为了避免复制整个数组。如果你想通过副本传递一个数组,你必须将它嵌入到一个 struct 中并传递一个 struct

如果您事先不知道数组的大小,动态数组分配也很有用(尽管在 C99 引入可变长度数组后这不是真的 - 但仍然,可变长度数组分配在堆栈上,所以你会有同样的问题)。

使用堆分配的另一个很好的理由是,对于非常大的数组,您很容易用完堆栈内存。堆通常更大。

关于c - 为什么你会想要在堆上有一个数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19797271/

相关文章:

c - fifo linux - write() 函数突然终止程序

c++ - 通过 "\0"而不是 memset() 批量初始化 char 数组

Javascript对象数组到字符串数组,更简单的方法?

javascript - 如何在 Javascript 对象数组中查找特定键的所有唯一值?

C - 了解结构的值设置模式

c 中的 Cholesky 分解失败

c - 如何用玩具语言实现返回语句?

c# - 遍历 BitArray 中所有可能的值组合

我可以执行驻留在数据段(ELF 二进制文件)中的代码吗?

java - 我的应用程序有 128MB 堆,但使用 1.6GB 实际 RAM。我怎样才能找到 1.4GB 的去向?