我刚刚阅读了关于GCC中的Statement Expressions Extension,并且在使用它时发现了一些意想不到的行为。GCC声明表达问题
请注意本实施例中:
#include <stdio.h>
int main(void)
{
char* res1 = ({
char arr[] ={'h', 'e', '\0'}; // was char *arr[]
arr[0] = 'x';
char* ptr = arr;
ptr;
});
char* res2 = ({
char arr[] ={'h', 'e', '\0'}; // was char *arr[]
arr[0] = 'X';
char* ptr = arr;
ptr;
});
printf ("%s %p\n", res1, res1);
printf ("%s %p\n", res2, res2);
return 0;
}
输出:
X 0x7fff93098160
X 0x7fff93098160
我注意到的是,在第二块中第一块中的变量arr
和arr
取相同的存储器地址。
为什么会这样呢?
对不起,我复制并粘贴了不正确的代码,我修改了它。 – 2012-01-14 22:08:13
我编辑了我的答案,因为更正的代码现在在问题中,因此不再需要。 – 2012-01-15 04:31:25
是否有任何参考文档来确认存储时间是自动的,而不是其他内容,如完整表达式的结尾? [出现在这个问题](http://stackoverflow.com/questions/40486940/declare-an-array-in-gcc-statement-expression-and-return-a-pointer-to-it)。海湾合作委员会官方文档页面没有说。 – 2016-11-08 12:52:46