我在C中有一个令人难以置信的段崩溃调用堆栈,任何人都可以帮助我吗?
int function(struct A *a)
{
... some other declare
struct B *b = a->b;
int count, len;
... some other declare
struct C *c = b->c; /* not crash here */
....some other decalre
if (b->e) { /*crash log indicate b is NULL and crash here,first line instrucment code*/
.....
}
....
}
我的问题是为什么struct C *c = b->c
没有发生崩溃。
GCC是编译器。
贝
答案 0 :(得分:0)
除非存在数据流依赖性,否则编译器不保证指令的有序执行。它有许多优化,其中一个是data flow optimization。
此外,如果您根本不使用变量c
,编译器将从代码(dead code optimization)中优化它,您可能根本看不到崩溃(如果其余的话)该程序工作正常)。
了解正在进行哪种优化的一种简单方法是在某处访问c
变量。另一种方法是禁用优化(GCC中的-O0
)。