关于C语言中的未初始化变量的值
来源:互联网 发布:模拟炒股软件 知乎 编辑:程序博客网 时间:2024/04/29 23:48
我们在刚学C编程的时候经常碰到“烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫”,这是为什么呢?
先从上次某公司笔试说起,当时有一题是考到了关于变量初始化的问题。在主函数外面(全局)和里面(局部)个定义一个int类型数值。然后没有赋值,直接打印出来,问输出什么。那会只知道全局默认是0,局部是一个负的挺大的数,还以为是最小整数。回来后试了下,局部的int默认的是-858993460,即0xcccccccc。
但是为什么局部的默认是0xcccccccc而不是其他的?
查了一些资料,发现VC的DEBUG版会把未初始化的指针自动初始化为0xCCCCCCCC,而不是就让它随机去,那是因为DEBUG版的目的是为了能让程序员更早的发现错误,把堆栈上的数据对初始化成了0xcc,也就是说局部变量如果不初始化,那么DEBUG版本中就会是0xCC,如果野指针的初值不确定。而汉字“烫”的编码恰好就是1100110011001100,这也就为什么初学的时候会出现“烫”了,因为那会经常会忘记赋值或者数组越界了。而全局变量链接时已分配空间,程序运行时,操作系统的加载器,负责把链接器分配给全局变量的虚拟内存空间,映射到一个初始化为零的页面,所以被初始化为零。全局和静态的默认初始化都是靠加载机制实现的。另外:未初始化的符号在目标文件的bss段中,而初始化的符号在data段中。
局部变量存在于(堆栈)中,全局变量存在于(静态区)中,动态申请数据存在于(堆)中。
先从上次某公司笔试说起,当时有一题是考到了关于变量初始化的问题。在主函数外面(全局)和里面(局部)个定义一个int类型数值。然后没有赋值,直接打印出来,问输出什么。那会只知道全局默认是0,局部是一个负的挺大的数,还以为是最小整数。回来后试了下,局部的int默认的是-858993460,即0xcccccccc。
但是为什么局部的默认是0xcccccccc而不是其他的?
查了一些资料,发现VC的DEBUG版会把未初始化的指针自动初始化为0xCCCCCCCC,而不是就让它随机去,那是因为DEBUG版的目的是为了能让程序员更早的发现错误,把堆栈上的数据对初始化成了0xcc,也就是说局部变量如果不初始化,那么DEBUG版本中就会是0xCC,如果野指针的初值不确定。而汉字“烫”的编码恰好就是1100110011001100,这也就为什么初学的时候会出现“烫”了,因为那会经常会忘记赋值或者数组越界了。而全局变量链接时已分配空间,程序运行时,操作系统的加载器,负责把链接器分配给全局变量的虚拟内存空间,映射到一个初始化为零的页面,所以被初始化为零。全局和静态的默认初始化都是靠加载机制实现的。另外:未初始化的符号在目标文件的bss段中,而初始化的符号在data段中。
局部变量存在于(堆栈)中,全局变量存在于(静态区)中,动态申请数据存在于(堆)中。
0 0
- 关于C语言中的未初始化变量的值
- 关于C语言中的未初始化变量的值
- 关于C语言中的未初始化变量的值
- 关于C语言中的未初始化变量的值
- 关于C语言中的未初始化变量的值
- C语言中的未初始化变量的值
- C语言变量的初始化
- C语言变量的初始化
- C语言中,定义局部变量时如果未初始化,则值是随机的,为什么?
- C语言中的const变量初始化
- 关于C语言中的变量
- 关于C语言中的变量
- C语言全局未初始化数据段分析前言:在分析C语言全局未初始化变量时,发现在目标文件中全局未初始化变量
- c语言变量初始化
- 没有躲过的坑--程序中的变量未初始化
- C语言中变量的初始化问题
- C语言中指针变量的初始化
- C语言结构变量的初始化
- Android事件分发详解(四)——事件传递基础示例
- wordcount运行各类问题解答
- 大学时数据结构课上写的排序算法
- Android事件分发详解(三)——ViewGroup的dispatchTouchEvent()源码学习
- 拓扑排序
- 关于C语言中的未初始化变量的值
- Android音频捕获(录音)
- 小知识点
- 自己动手丰衣足食之纯CSS画的基本图形(矩形、圆形、三角形、多边形、爱心、八卦等)
- 019Adapter初解
- Android事件分发详解(二)——View的事件分发
- ios safe dictionary simple implement
- JSP跳转
- 开发环境应用检测脚本