C - charArray总是和&charArray一样吗?

new*_*guy 4 c

我正在阅读一篇关于整个程序优化的文章."链接时代码生成"部分中的最后一段表示将堆栈上分配的数组归零可能不会产生相同的效果,具体取决于它的归零方式:

打开整个程序优化确实发现了一些具有未定义行为的错误.没有WPO,这些都不会崩溃.通过WPO,他们做到了.在一种情况下,通过指向未初始化的内存的指针进行成员函数调用.在其他几种情况下,假设堆栈上的数组与它们自己的地址相同. 也就是说,假设memset(&charArray,0,sizeof(charArray))与memset具有相同的效果(charArray,0,sizeof(charArray)).标准不保证这一点,并且在WPO下似乎有所改变.

我想如果我做char foo[1]foo将永远是==&foo.有人能解释一下这里发生了什么吗?谢谢

hac*_*cks 5

foo是一个数组,并且在表达式foo中将转换为指向其第一个元素的指针,除非是一元&sizeof运算符的操作数.所以,在这种情况下foo == &foo[0].&foo是数组的地址foo,而不是第一个元素的地址foo.
虽然价值foo&foo是等价的,它们的类型是不同的.foo是类型的char *衰减后而&foo为型的char (*)[1].

  • 这如何适用于`memset`示例以及我们应该得出什么结论?在LTCG/WPO出现时它如何变化? (2认同)