在我的代码中,我有这一行:
f(t->a, t->b, destroy(t));
其中f
是函数,t
是指向结构的指针,destroy
是释放指针t并返回NULL
的函数。代码在一些编译器(在OS X上的cc,gcc,clang和Linux上的clang)上成功编译并运行,如我所料 - t->a
和t->b
在释放t
之前进行了评估。但是,当在Linux上使用cc / gcc进行编译时,我遇到了分段错误,就像我试图取消引用空指针一样。是什么导致的?
谢谢!
答案 0 :(得分:4)
我们指定了函数调用的参数的评估顺序。 destroy(t)
可以先评估,t
将是免费的,因此t->a
将调用未定义的行为。
在函数调用中
(*pf[f1()]) (f2(), f3() + f4())
可以按任何顺序调用函数
f1
,f2
,f3
和f4
。 [...]