OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2233|回复: 6

局部变量未初始化就有值了是内存溢出吗?

[复制链接]

19

主题

31

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2019-6-16
在线时间
27 小时
发表于 2019-6-19 18:01:46 | 显示全部楼层 |阅读模式
3金钱
很奇怪的事情,因为出现了一些乱码,进debug追踪,发现有局部指针变量未初始化就有值了,这是内存溢出还是什么鬼?如果是溢出的话怎么找到溢出的源头?

最佳答案

查看完整内容[请看2#楼]

这就是传说中的野指针啊! LZ 搞C/c++编程的时间不长吧? 你局部指针没初始化,就是说这个指针指向不可预料的地址,而且这个地址可能已经分配给其他变量,或者是还没分配,里面有随机的值。 “如果是溢出的话怎么找到溢出的源头?” ---- 这个不叫溢出。但关于指针的安全,是个经典问题,答案就是没有捷径,只能慢慢找,并且养成良好的编程习惯,尽量在定义指针的同时分配空间,并赋予一个确定的值,例如0 .不分配的话,就 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

8

主题

293

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1001
金钱
1001
注册时间
2018-8-16
在线时间
327 小时
发表于 2019-6-19 18:01:47 | 显示全部楼层
本帖最后由 brucewoo 于 2019-6-19 19:41 编辑

这就是传说中的野指针啊! LZ 搞C/c++编程的时间不长吧?
你局部指针没初始化,就是说这个指针指向不可预料的地址,而且这个地址可能已经分配给其他变量,或者是还没分配,里面有随机的值。

“如果是溢出的话怎么找到溢出的源头?”
---- 这个不叫溢出。但关于指针的安全,是个经典问题,答案就是没有捷径,只能慢慢找,并且养成良好的编程习惯,尽量在定义指针的同时分配空间,并赋予一个确定的值,例如0 .不分配的话,就在定义指针的时候把指针赋值NULL,这样安全一点,但要是使用了的话还是有问题。
回复

使用道具 举报

7

主题

333

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1838
金钱
1838
注册时间
2012-7-16
在线时间
504 小时
发表于 2019-6-19 19:37:56 | 显示全部楼层
指针不初始化怎么能用?
回复

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4520
金钱
4520
注册时间
2018-5-11
在线时间
946 小时
发表于 2019-6-19 22:34:10 | 显示全部楼层
本帖最后由 warship 于 2019-6-19 22:40 编辑

楼主有不赋值就使用局部变量的习惯吗?
这个和猜色子有什么区别呢?尤其是指针,不初始化就用等于自杀。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

19

主题

31

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2019-6-16
在线时间
27 小时
 楼主| 发表于 2019-6-20 09:46:18 | 显示全部楼层
brucewoo 发表于 2019-6-19 18:01
这就是传说中的野指针啊! LZ 搞C/c++编程的时间不长吧?
你局部指针没初始化,就是说这个指针指向不可预 ...

原来这样啊,我印象中都初始化了,这里说的局部指针未初始化就有值是说在初始化语句之前就有值了,只是有个二级指针没有完全释放,不清楚是否别的指针未释放导致这个局部指针也出问题。那如果已经出现野指针了怎么处理呢?
这个二级指针每次都是固定地指向地址0x0092A2A2,但是释放下面的子指针时会报错:跳到HardFault_Handler,报错cannot access memory.
回复

使用道具 举报

8

主题

154

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
439
金钱
439
注册时间
2018-12-21
在线时间
126 小时
发表于 2019-6-20 11:09:10 | 显示全部楼层
看来你对底层不了解呀!你以为这是MSC-8051呢,就那一点内存空间,一上电,Startup.A51里的代码把内存全部清零了?STM32中startup.s里面可没有这种代码,所以上电后每一个内存单元的内容是完全随机的。你声明一个指针,编译器按照一定规则在内存中分配一个字的空间,如果是临时变量,有很大概率直接映射到寄存器上。但是这些地方的初值是无法确定也是无需关心的。因为你创建一个指针变量实体后,编译器将某个存储单元确定为该变量,你必须对其进行初始化冲刷掉原来的无用的,不定的值,这样你的程序才可以用。否则你想让你的程序试试上帝是如何掷色子的吗?哪怕是内存全部初始化为0,那你新声明的变量初值最好的也还是0,一样不能直接使用,也更内存溢出毫无关系。
回复

使用道具 举报

8

主题

293

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1001
金钱
1001
注册时间
2018-8-16
在线时间
327 小时
发表于 2019-6-20 20:10:43 | 显示全部楼层
yuyan 发表于 2019-6-20 09:46
原来这样啊,我印象中都初始化了,这里说的局部指针未初始化就有值是说在初始化语句之前就有值了,只是有 ...

当你你定义一个指针,例如 int* pPointer;
这时它本身的值是随机的,即他指向一个随机的地址,这个地址可能是不合理的,可能是别的变量的,也可能刚好是没有使用的内存的。
如果这时你直接就使用了,例如 *pPointer =123;  这样你就是往这个随机的地址写入了数据,有可能会导致严重的后果。
所以良好的习惯是,定义时马上分配空间。作用域结束时释放该指针。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-16 21:13

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表