我最近发现在C ++中,在函数外部声明int会将它们初始化为0
,但在函数内部,行为是未定义的,并且会返回无意义的值或可能导致崩溃编译器。但是我发现,如果我在一个函数中声明一个int(让我们称之为j
),然后通过编写cout << j;
来打印它,它将打印0
并从那里开始在函数中它将等于0
并且就这样行事。
首先,为什么印刷会这样做?为什么这会导致函数内部未声明的int停止像无意义的值那样开始表现得像是隐式初始化为0
,因为它在函数之外呢?
其次,为什么C ++以这种方式开始工作?哪个天才决定未初始化的int应该在功能之外以明确的方式行事,但不在其中?用编译器指定和实现这不是一件容易的事吗?为什么在上帝的绿色地球上这是如何运作的呢?
答案 0 :(得分:0)
Globals / Statics(外部函数)是&#39; Heap&#39;变量。他们总有一个地址。当它在堆上为该数据类型分配空间时,C和它的派生物保证0初始化。
局部变量(内部函数)。编译器所做的就是将该类型的大小添加到函数&#39; stack&#39;因此,当函数在内存中的任何位置重新定位/加载时,堆栈空间只是之前存在的一块内存(未定义),并且该值可能是无意义的。
只有在编译器需要在编译时知道有关它的值的信息的上下文中使用本地未初始化变量时,才会使编译器崩溃。印刷不是其中之一。或者当你告诉编译器打破某些警告时。
查找程序堆&#39;和&#39;功能堆栈&#39;记忆更多信息。这是一个链接: http://gribblelab.org/CBootcamp/7_Memory_Stack_vs_Heap.html
希望这可以帮助您找到所需的资源。这是一个非常有效的问题,初学者应该在组装级别创建具有真实内存管理的物理组件时,必须了解基于c语言的机制。
编辑:另外值得注意的是,并非所有堆栈变量都被使用。想象一下,如果你有两个控制路径(如果是其他模式)并且你在每个控制路径中声明了int。只需要一个int,如果只需要一个int,编译器不希望为两者存储初始值。
每次通过运行时调用设置函数堆时,昂贵(cpu周期)将所有类型的内存归零,您永远不会想要当大多数变量(应该)最终被设置为稍后有用的东西时,就会发生这种情况!!!