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].