C-charArray всегда то же самое, что &charArray?
Я читаю статью об оптимизации всей программы. В последнем абзаце раздела генерация кода времени связи говорится, что обнуление массива, выделенного в стеке, может не иметь того же эффекта в зависимости от того, как он обнуляется:
Включение оптимизации всей программы действительно обнаружило несколько ошибок, которые имели неопределенное поведение. Без WPO они как-то не разбились. С WPO они так и сделали. В одном случае вызов функции-члена производился через указатель на неинициализированная память. В ряде других случаев предполагалось, что массивы в стеке идентичны своим собственным адресам. То есть предполагалось, что memset(&charArray, 0, sizeof(charArray)) будет иметь тот же эффект, что и memset(charArray, 0, sizeof(charArray)). Это не гарантируется стандартом и, по-видимому, изменяется в соответствии с WPO.
Я думал, что если я сделаю char foo[1]
, то foo
всегда будет ==
к &foo
. Может кто-нибудь объяснить, что здесь происходит? Спасибо
1 ответ:
foo
является массивом и в выраженияхfoo
преобразуется в указатель на его первый элемент, за исключением случаев, когда операнд унарных&
иsizeof
операторов. Итак, в таких случаяхfoo == &foo[0]
.&foo
- это адрес массиваfoo
, а не адрес первого элементаfoo
.
Хотя значенияfoo
и&foo
эквивалентны, их типы различны.foo
имеет типchar *
после распада, в то время как&foo
имеет типchar (*)[1]
.