c/c++语言开发共享GCC声明表达问题

我刚刚阅读了GCC中的Statement Expressions Extension,我在使用它时发现了一些意想不到的行为。

请注意这个例子:

#include  int main(void) { char* res1 = ({ char arr[] ={'h', 'e', ''}; // was char *arr[] arr[0] = 'x'; char* ptr = arr; ptr; }); char* res2 = ({ char arr[] ={'h', 'e', ''}; // was char *arr[] arr[0] = 'X'; char* ptr = arr; ptr; }); printf ("%s %pn", res1, res1); printf ("%s %pn", res2, res2); return 0; } 

输出:

 X 0x7fff93098160 X 0x7fff93098160 

我注意到,第一个块中的变量arr和第二个块中的arr采用相同的内存地址。

为什么会这样?

    两次出现的arr都是具有自动存储持续时间的数组对象; 它们是语句表达式中封闭块{ ... }本地。

    每个语句表达式都会获取该局部变量的地址; 当地址arr` 不再存在 and used *after* the end of the block, when the object该地址保存在res1和res2中and used *after* the end of the block, when the object

    这与返回局部变量地址的函数是同一个问题。 当变量不再存在时,地址变为无效,并且程序的行为未定义。

    所以不要这样做。

    据我所知,语句表达式中定义的变量范围只是那些语句表达式本身。 也就是说,当初始化res1时,数组已经超出范围,指针指向未分配的内存。 第二个语句表达式中的数组恰好占用相同的内存。 它实际上与以下代码没有太大区别:

     char* res1; { char arr[] ={'h', 'e', ''}; arr[0] = 'x'; char* ptr = arr; res1 = ptr; } char* res2; { char arr[] ={'h', 'e', ''}; arr[0] = 'X'; char* ptr = arr; res2 = ptr; } printf ("%s %pn", res1, res1); printf ("%s %pn", res2, res2); 

    两个数组都是语句表达式的本地数组,并且它们占用的内存可以在表达式结束后重用。 在这种情况下,它重用。

    如果您要访问或使用这些指针的值,您将调用未定义的行为,因此它们的相等性无关紧要。

      以上就是c/c++开发分享GCC声明表达问题相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/559723.html

      (0)
      上一篇 2021年1月27日
      下一篇 2021年1月27日

      精彩推荐