未被初始化的变量怎么赋值

纹枰老妖 尚无职位  2014-02-09 01:50:05
在c语言中,声明一个变量,不要对它初始化,这个变量依然可以得到一个值,如下图所示。问:这个变量得到这个值的原理是什么?有什么规律吗【反正不是随机得到值的,因为未初始化的变量在固定位置得到的都是固定值】??顺带说一下,下图中变量a的地址为1245052
...全文
282 点赞 收藏 24
写回复
24 条回复
赵4老师 2014年02月10日
引用 15 楼 zhao4zhong1 的回复:
其实电脑开机后物理内存的每个字节都是可读写的,区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页,一页通常为4KB。
推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。
回复 点赞
千树之影 2014年02月10日
引用 楼主 wenpinglaoyao 的回复:
在c语言中,声明一个变量,不要对它初始化,这个变量依然可以得到一个值,如下图所示。问:这个变量得到这个值的原理是什么?有什么规律吗【反正不是随机得到值的,因为未初始化的变量在固定位置得到的都是固定值】??顺带说一下,下图中变量a的地址为1245052
局部变量未初始化的值就是当前栈里面的旧值,具体取决于前一个函数的内容。 你可以把这个测试代码放一个函数里,然后试试在这个函数前运行不同的函数,a的值会不同的。
回复 点赞
Rac_javac 2014年02月10日
简单点就是说,你引用的那个地址如果你没有初始化赋值,那么显示的就是内存地址之前的值。 比如 应用程序A使用内存地址0XFFFF 赋值为 123, 然后应用程序A释放引用。这块内存标记为自由内存。但是里面的值不会清除。 这个时候你使用内存地址0XFFFF,但是不进行初始化,打印出来就是123 所以会觉得不同机器,不同时间显示的值不一样。
回复 点赞
zhuobattle 2014年02月10日
未初始化变量的值是未知的,你想知其所以然的精神是好的,但要用对地方
回复 点赞
qingshangcaochl 2014年02月10日
如果是全局变量不初始化,则初始化值是0;如果是局部变量在定义时未初始化,则初始值是不定的。
回复 点赞
ggglivw 2014年02月10日
初始化0xcccc那是因为是debug模式,编译器干了这个事情,release不会初始化填充这个,获得内存,上次被写入的BYTE是多少,里面的数据就是多少
回复 点赞
「已注销」 2014年02月10日
介个问题你要理解堆栈是做什么用的,什么时候会用到堆栈,里面值是谁改的。 定义的值可能随机可能不随机,兄台为何不自己反汇编下,用调试工具在该内存地址下读写断点呢? 这东西除非自己去调试,否则别人跟你说也不会理解的
回复 点赞
「已注销」 2014年02月10日
引用 13 楼 a345485527 的回复:
[quote=引用 12 楼 wenpinglaoyao 的回复:] 好奇才是进步的动力。这个没有意义的问题,看样子是没人能够回答的了了。
同学,不要纠结了,在我的电脑中一样的代码它就是这个值 [/quote]一看就知道debug的0xCCCCCCCC
回复 点赞
No_game_no_life 2014年02月09日
电脑不同,系统不同,编译器不同,都得到不同的值吧,还有地址应该是printf("%p",&a)。。
回复 点赞
赵4老师 2014年02月09日
其实电脑开机后物理内存的每个字节都是可读写的,区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页,一页通常为4KB。
回复 点赞
lin5161678 2014年02月09日
引用 12 楼 wenpinglaoyao 的回复:
好奇才是进步的动力。这个没有意义的问题,看样子是没人能够回答的了了。
也许好奇的确是 但是无知应该不是
回复 点赞
Pump天天学习 2014年02月09日
引用 12 楼 wenpinglaoyao 的回复:
好奇才是进步的动力。这个没有意义的问题,看样子是没人能够回答的了了。

同学,不要纠结了,在我的电脑中一样的代码它就是这个值
回复 点赞
纹枰老妖 2014年02月09日
好奇才是进步的动力。这个没有意义的问题,看样子是没人能够回答的了了。
回复 点赞
hushoubo 2014年02月09日
不用太纠结,每次记得赋初值就行了
回复 点赞
纹枰老妖 2014年02月09日
回复8#: 不是随机吧,不然随机的东西就不用时间做种子这么麻烦了。
回复 点赞
纹枰老妖 2014年02月09日
我纯粹是出于对计算机的好奇而问的这个问题,先说一下我个人的理解:任何一个变量都是由两部分构成的,一是它的地址,另外一个则是这段地址所对应的二进制【即变量的值】。 按照6#所说,未初始化的外部变量会默认为0,那是因为所有外部变量地址所对应的二进制位都是0【初始时刻】。而我图片中的变量a之所以没有初始化也有非0值的变量,那是因为那段地址所对应的二进制位存在一些1,所以我最想问的是——为什么计算机的那些二进制位上会固定存在那些1呢?
回复 点赞
Pump天天学习 2014年02月09日
引用 7 楼 wenpinglaoyao 的回复:
4#请推荐一个好的平台,谢谢。
兄弟,不要纠结这个没有意义的事了,小心走火入魔 完全是随机的,再过个一段时间你就懂了
回复 点赞
纹枰老妖 2014年02月09日
4#请推荐一个好的平台,谢谢。
回复 点赞
zhuyf87 2014年02月09日
int a; 如果是全局变量,a会被编译器自动初始化为0。 如果是局部变量,a的值未定义。标准都没有规定a的值应该是什么,那刻意去追查有什么规律就没有意义,也不能去依赖这样的规律。
回复 点赞
max_min_ 2014年02月09日
一个随机值而已,环境没有变,随机值就没有发生变化而已!
回复 点赞
发动态
发帖子
新手乐园
创建于2007-09-28

1.4w+

社区成员

4.1w+

社区内容

C/C++ 新手乐园
社区公告
暂无公告