没开光的代码为什么会挂
“首先,咱们来看看,没有开过光的代码为什么会挂!”,李四打开VS Code,把那段开光代码给删掉了:
“我知道了”,小明突然喊道,“bar()中的局部变量idx没初始化,是一个随机值,所以buf[idx] = 'A'这一句内存访问异常了!”。
“这么简单的问题,谁都看得出来!”,李四瞥了小明一眼,继续说道:“问题是,idx真的是一个随机值吗?如果是随机值的话,理论上讲,这个程序应该还是有概率能成功运行的,对吧?可现在为什么会100%每次都segfault呢?”
“请大神赐教!”,小明有点不好意思了。
“咱们先在GDB中看一下idx的值是多少”,李四打开GDB,开始调试:
“idx = 16843009,这看起来不就是个随机值嘛!”,小明有点不服气。 “随机值?你再看!”,李四在GDB中敲了一条命令:
“呃,原来idx = 0x01010101,我明白了”,小明恍然大悟,“这个是在fool()中memset(array, 1, sizeof(array))这一句残留下来的值!” “是的,说到点子上了”,李四表示赞许,“C语言中未初始化的局部变量,并不是真的随机值,而是当时栈上的残留值,这个值有可能是之前某个函数执行过后残留在栈上的,只不过我们一般不太关心栈上的残留值,所以看起来像是个随机值”,李四继续说,“我们看下fool()中array的地址和bar()中idx的地址就明白了”。 一边说着,李四又在GDB中重新运行程序,并且在第8行和第13行分别设置了一个断点,把array和idx的地址打印了出来: “看到了吧,array[9]的地址和idx的地址一模一样!” “原来如此!”,众人恍然大悟!
|