C-charArray всегда то же самое, что &charArray?


Я читаю статью об оптимизации всей программы. В последнем абзаце раздела генерация кода времени связи говорится, что обнуление массива, выделенного в стеке, может не иметь того же эффекта в зависимости от того, как он обнуляется:

Включение оптимизации всей программы действительно обнаружило несколько ошибок, которые имели неопределенное поведение. Без WPO они как-то не разбились. С WPO они так и сделали. В одном случае вызов функции-члена производился через указатель на неинициализированная память. В ряде других случаев предполагалось, что массивы в стеке идентичны своим собственным адресам. То есть предполагалось, что memset(&charArray, 0, sizeof(charArray)) будет иметь тот же эффект, что и memset(charArray, 0, sizeof(charArray)). Это не гарантируется стандартом и, по-видимому, изменяется в соответствии с WPO.

Я думал, что если я сделаю char foo[1], то foo всегда будет == к &foo. Может кто-нибудь объяснить, что здесь происходит? Спасибо

1 4

1 ответ:

foo является массивом и в выражениях foo преобразуется в указатель на его первый элемент, за исключением случаев, когда операнд унарных & и sizeof операторов. Итак, в таких случаях foo == &foo[0]. &foo - это адрес массива foo, а не адрес первого элемента foo.
Хотя значения foo и &foo эквивалентны, их типы различны. foo имеет тип char * после распада, в то время как &foo имеет тип char (*)[1].