它在C中创建一个数组,当从内存中的程序出来时会发生什么?

时间:2013-03-25 04:21:57

标签: c arrays memory

我有这个疑问,你有一个拥有10亿个元素的数组,你可以按如下方式创建数组:

int array[1000] = {1,2, ..., n.}

然后你完成了这个程序。

不像java那里的机器java垃圾收集内存清理记录关于这种安排的存储。 他们留在记忆中还是被释放?

6 个答案:

答案 0 :(得分:4)

当进程退出时,操作系统将释放进程正在使用的所有内存。

(这不适用于某些小型嵌入式操作系统。)

答案 1 :(得分:1)

程序的内存由操作系统管理,因此在程序退出的任何情况下都会释放。

无论如何,你所分配的内容可能是

  • 静态和任何函数之外(因此它不会像在Java中那样在堆上进行管理),它实际上并没有被分配,也没有被释放
  • 自动堆栈(这确实是动态的,但不管怎样在Java中完成)并且当它退出范围时就会被释放

真正的比较就像是

int *array = malloc(sizeof(int)*1000);

这将驻留在内存中,直到调用free(array)或程序退出。

答案 2 :(得分:1)

如果你这样做

if (true) {
  int array[1000] = {1,2,3};
  //...
}

// array[1000] "freed" here.

然后退出“if”括号时将释放内存。这是因为内存驻留在堆栈上,“分配”只是堆栈指针的移动。当作用域退出时,堆栈指针将返回到输入作用域之前的位置。所以在这种情况下,分配和释放几乎是免费的(性能明智),假设您的堆栈足够大,可以容纳额外的1000个整数。在某些嵌入式系统上,它不会,并且您的应用程序将崩溃。

同样适用于

int foo( int x )
{
  int array[1000] = {1,2,3};
  // ...
  return array[0];
}

// array[] "freed" here.

编辑:在最后一种情况下,如果用main替​​换foo(),那么当程序退出时,数组将被“释放”。

答案 3 :(得分:0)

  1. 通常,操作系统不允许您拥有int a[10000000000000000000]
  2. 他们的价值观留在记忆中。但记忆将被退回。

答案 4 :(得分:0)

简单地说,内存将在程序结束时释放。

答案 5 :(得分:0)

在c中,如果您将数组定义为[1000],那么它将在堆栈部分中分配,并且它会在程序存在时自动释放内存。但是如果你动态分配(通过使用malloc),那么你必须使用free(数组)来释放内存。 阵列的最大大小取决于系统RAM大小。