【发布时间】:2014-02-23 07:50:24
【问题描述】:
我从事 C 语言专业编码已经有一段时间了,但仍然被一些与指针相关的问题难住了。我非常感谢 SO 社区在理解以下问题方面的帮助。
以下代码崩溃并生成核心文件。
void func1() // Frame 1 in GDB stack trace.
{
UTYPE *ptr; // pointer to user defined type
...
// data is of type UTYPE and has valid contents.
// lets say its address is 0x100
ptr = &data; --- (1)
...
func2(ptr); --- (2)
...
}
void func2(UTYPE *inp) // Frame 0 in GDB stack trace.
{
if(!inp) --- (3)
return;
...
// another_ptr is of UTYPE * which is a NULL.
inp = another_ptr; ---- (4)
/* Did not check for NULL and dereference inp and CRASH */ ---- (5)
}
来自 GDB 的简化回溯:
Frame 0:
func2(inp = 0x0)
// crash at line (5) due to dereference
Frame 1:
func1: func2(0x0)
// `ptr` at line (2) is 0x0. Why is this so?
为什么ptr 在第 1 帧中显示为 0x0 (NULL)?
当func2()被调用时,它的调用栈如下:
| //local vars |
| |
| another_ptr = |
| NULL |
+---------------+
| return addr |
+---------------+
| input args |
| copy of ptr |
| contents |
| 0x100 |
对于func1(),它的调用栈应该是这样的:
| |
| ptr = 0x100 |
| |
+---------------+
| return addr |
+---------------+
| input args |
| none in this |
| func |
当inp在第(4)行的func2()中变成NULL时,在func1()中是如何体现的?
【问题讨论】:
-
我喜欢你的表现。
-
这很奇怪。我希望第 1 帧的回溯会显示
func1() at thelinenumberoflocationlabeled(2)而不会显示对func2的调用。你是在使用bt命令还是别的什么? -
@MarkPlotnick 我正在使用
bt命令。它打印所有堆栈帧,而不仅仅是第 1 帧。我上面对 GDB 回溯的表示只是为了帮助解释我的问题。如果有什么问题,请告诉我。 -
好的。我的 gdb 的
bt命令显示调用func2()的第 0 帧和调用func1的第 1 帧。它的第 1 帧显示不像您那样显示对func2的调用。我只是无法重现您的确切问题。