以下C程序是否保证退出 0 或者是否允许编译器识别对象 s 和 t 如C++中所允许的那样 命名返回值优化 (NRVO)复制省略形式?
0
s
t
typedef struct { int i, j; double a, b; } S; int result; S test(S* q) { S s = {0, 0, 0, 0}; result = &s == q; return s; } int main(void) { S t = test(&t); return result; }
Clang退出 1 出乎我的意料,看看 https://godbolt.org/z/ME8sPGn3n .
1
(在C++中,两者 0 和 1. 由于明确允许执行NRVO,这些结果是有效的。)
1.
保证以0退出。 t 和 s 它们是不同的对象,指向它们的指针不能相等。
关于您删除的代码:
以下相关寿命考虑因素可能不同的变化呢?
从 https://port70.net/~nsz/c/c11/n1570.html#6.2.4p2 :
当指针指向的对象(或刚刚过去的对象)到达其生命周期结束时,指针的值变得不确定。
它可能返回1或0或执行陷阱。