Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何为在main()外部vs内部声明的变量分配内存_C++_Arrays_Memory - Fatal编程技术网

C++ 如何为在main()外部vs内部声明的变量分配内存

C++ 如何为在main()外部vs内部声明的变量分配内存,c++,arrays,memory,C++,Arrays,Memory,我注意到,在处理一些大型数组(比如1000乘1000的倍数)时,如果我在main()内声明数组,我的程序就会耗尽内存,但如果我在main()外声明数组,即使是对于较大的数组,这似乎也不会发生。有人能解释一下区别是什么吗?在大多数系统中,函数中声明的内存将放在堆栈上,堆栈很小,可能会溢出。但是,在main()之外声明的内存将不可用。堆栈的大小(和存在性)是依赖于实现的——尽管我不知道任何堆栈不存在的常用C++系统。p> 从技术上讲,函数中声明的内存具有自动存储持续时间,这意味着它是在封闭代码块的

我注意到,在处理一些大型数组(比如1000乘1000的倍数)时,如果我在main()内声明数组,我的程序就会耗尽内存,但如果我在main()外声明数组,即使是对于较大的数组,这似乎也不会发生。有人能解释一下区别是什么吗?

在大多数系统中,函数中声明的内存将放在堆栈上,堆栈很小,可能会溢出。但是,在
main()
之外声明的内存将不可用。堆栈的大小(和存在性)是依赖于实现的——尽管我不知道任何堆栈不存在的常用C++系统。p>
从技术上讲,函数中声明的内存具有
自动
存储持续时间,这意味着它是在封闭代码块的开头分配的,并且在该代码块完成后无效

在main之外声明的内存具有
静态
存储持续时间,这意味着它是在程序启动时分配的,并且在程序的生命周期内有效

有关存储持续时间的更多信息,请参阅


如果要在函数中声明大量内存,可以使用分配函数
malloc
new
。清楚地解释堆栈和堆之间的区别(虽然它是C,而不是C++),但它仍然适用于C++。

< P>当一个函数在函数内声明(在你的例子中,<代码>主/代码>)时,它被分配到栈上,如果它太大(例如,一个大数组),你会遇到。
在所有函数之外定义的变量是静态分配的。它的生命周期一直持续到程序终止。

这是与实现相关的问题。从理论上讲,在与全局范围相同的函数中,应该可以定义内存消耗变量


但在实践中,全局范围内的变量将在目标机器代码的数据段中声明,并且有更多的可用空间可分配。但是,在函数中,通常会使用堆栈概念,这有一些限制。

如果它是函数的局部(
main
只是另一个函数),则它将进入堆栈。1000x1000x8=800万字节。这可能大于堆栈大小。不同的编译器可能有不同的大小,但我认为默认值是1MB

全局变量(它们具有静态存储)不分配在堆栈上,也不分配在堆上,而是分配在一个数据段上,该数据段的大小在整个程序期间保持不变


请注意,一个进程有两个以上的内存区域,堆栈和堆。它还有一个代码/文本段、一个用于程序中初始化静态变量的数据段和另一个用于未初始化静态变量的称为bss段的数据段。有关详细信息,请参见。

堆栈的大小约为2-3M,而堆的大小与虚拟内存有关。它可能非常大。您可以这样声明它
static int num[1000][1000]

您必须决定大块内存是来自堆(决定动态分配数组)还是来自堆栈(在某个函数中有一个局部变量,不在范围内时将被释放),在main外部将数据放入所有函数共享的全局地址空间,在main之前分配,并在main完成后(程序退出时)解除分配。

当程序将执行时,它将创建一个进程,该进程将占用内存中的固定内存大小。这个过程包含四个部分:数据部分、代码部分、堆和堆栈。在这四个部分中,数据和代码部分的大小是固定的,而堆栈(存储本地变量、静态数据)和堆(存储动态内存分配的数据)的大小在执行期间会有所不同。现在,如果您在全局区域的main means之外声明变量,那么它将存储在进程的数据部分中,该数据部分具有固定的大小。因此,在主节点外创建非常大的数组将导致数据段出现问题。若您将它存储在main中,那个么它的大小可以由堆栈管理

不,它不会在堆上。它是静态分配的。啊,非常正确。我已经更正了帖子和我的记忆:)这是否意味着您不会遇到来自所有函数之外的分配的堆栈溢出?我不知道你是不是想暗示这个。因为数组不在堆栈上,所以不能通过将其放入全局范围来获得堆栈溢出。如果在全局范围内声明太大的数组,系统最终将耗尽内存,无法启动应用程序。堆分配也是如此,不可能产生堆栈溢出,但可能会耗尽堆内存。@人为堆栈溢出可能是由各种原因造成的,在本例中,一个非常大的堆栈变量,如果在所有函数之外定义了一个变量,则它不会占用堆栈空间。当然,其他类型的堆栈溢出仍然是可能的(非常深的递归等)