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

2019-07-20 23:34发布

很奇怪的事情,因为出现了一些乱码,进debug追踪,发现有局部指针变量未初始化就有值了,这是内存溢出还是什么鬼?如果是溢出的话怎么找到溢出的源头?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
brucewoo
1楼-- · 2019-07-21 01:27
本帖最后由 brucewoo 于 2019-6-19 19:41 编辑

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

“如果是溢出的话怎么找到溢出的源头?”
---- 这个不叫溢出。但关于指针的安全,是个经典问题,答案就是没有捷径,只能慢慢找,并且养成良好的编程习惯,尽量在定义指针的同时分配空间,并赋予一个确定的值,例如0 .不分配的话,就在定义指针的时候把指针赋值NULL,这样安全一点,但要是使用了的话还是有问题。
hyghyg1234
2楼-- · 2019-07-21 07:00
 精彩回答 2  元偷偷看……
warship
3楼-- · 2019-07-21 07:03
 精彩回答 2  元偷偷看……
yuyan
4楼-- · 2019-07-21 10:30
brucewoo 发表于 2019-6-19 18:01
这就是传说中的野指针啊! LZ 搞C/c++编程的时间不长吧?
你局部指针没初始化,就是说这个指针指向不可预 ...

原来这样啊,我印象中都初始化了,这里说的局部指针未初始化就有值是说在初始化语句之前就有值了,只是有个二级指针没有完全释放,不清楚是否别的指针未释放导致这个局部指针也出问题。那如果已经出现野指针了怎么处理呢?
这个二级指针每次都是固定地指向地址0x0092A2A2,但是释放下面的子指针时会报错:跳到HardFault_Handler,报错cannot access memory.
0x00000000
5楼-- · 2019-07-21 12:45
看来你对底层不了解呀!你以为这是MSC-8051呢,就那一点内存空间,一上电,Startup.A51里的代码把内存全部清零了?STM32中startup.s里面可没有这种代码,所以上电后每一个内存单元的内容是完全随机的。你声明一个指针,编译器按照一定规则在内存中分配一个字的空间,如果是临时变量,有很大概率直接映射到寄存器上。但是这些地方的初值是无法确定也是无需关心的。因为你创建一个指针变量实体后,编译器将某个存储单元确定为该变量,你必须对其进行初始化冲刷掉原来的无用的,不定的值,这样你的程序才可以用。否则你想让你的程序试试上帝是如何掷 {MOD}子的吗?哪怕是内存全部初始化为0,那你新声明的变量初值最好的也还是0,一样不能直接使用,也更内存溢出毫无关系。
brucewoo
6楼-- · 2019-07-21 15:32
yuyan 发表于 2019-6-20 09:46
原来这样啊,我印象中都初始化了,这里说的局部指针未初始化就有值是说在初始化语句之前就有值了,只是有 ...

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

一周热门 更多>