作者:sdfqw4543gf | 来源:互联网 | 2023-05-17 23:11
本人写了非常简单的两段代码,第一段代码如下:没加endl,而且由于是在函数内未初始化,所以打印的应该是个很大的数,所以结果没什么问题。结果如下:然而!!!!我只是在原基础上加了
本人写了非常简单的两段代码,第一段代码如下:
没加endl,而且由于是在函数内未初始化,所以打印的应该是个很大的数,所以结果没什么问题。结果如下:
然而!!!!我只是在原基础上加了一个endl,结果就变成0 了!!!
源码:
结果!!!
楼主特地打印了一下加了和没加endl 的b的地址,加了endl的b的地址是 0x7fff5fbff7a8 , 没加 endl 的地址是 0x7fff5fbff7b8
这尼玛是什么情况啊。。
真心求解释。。。
而且只要有endl, 所有的未初始化的变量都是0。。。。。
7 个解决方案
其实电脑开机后物理内存的每个字节都是可读写的,从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页,一页通常为4KB。
推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。
endl并没有这种功能,在VS下测试不会,具体的话看汇编就知道了
使用endl时,endl会被翻译成汇编代码,代码是会占用内存的哟。没有使用endl时,你定义的变量b就不在使用了endl的地址上了。。。debug状态下有个反汇编(disasmbly),查看下汇编就知道了(VS大发下。)
局部变量如果你没自己初始化,那么它的值就是该地址上的遗留值,系统不会为他初始化0的。
endl仅仅是加换行,并刷新缓冲而已