Страницы

Поиск по вопросам

воскресенье, 29 декабря 2019 г.

Использование sizeof на неинициализированных переменных

#cpp #c


Можно ли использовать sizeof() подобным образом, ведь использование неинициализированной
переменной UB?

int x;
sizeof(x);

    


Ответы

Ответ 1



sizeof выполняется на этапе компиляции, и его результат не зависит от значения, хранимого в переменной, для которой "вызывается" sizeof. Более того, говорить о каких-то значениях автоматических переменных вообще нельзя до этапа выполнения программы в определённом месте. А вот для констант со статическим классом хранения, например, глобальных, это можно было бы предположить, но, как бы то ни было, результат sizeof от этого не зависит. Было бы странным, если скажем для int i = 1; результат sizeof(i) отличался при использовании другого значения того же типа, например от int i = 100500. Т.е. sizeof так или иначе вычисляет размер типа, несмотря на то, что может вызываться и для переменных.

Ответ 2



Выражение-операнд sizeof не является вычислимым (за редким исключением в С) и на него не распространяются требования, применяемые к вычислимым выражениям. В вашем примере неопределенного поведения нет. Однако в языке С, если оператор sizeof применен к типу "массив изменяемого размера", то его выражение-операнд в общем случае является вычислимым и на него распространяются все обычные требования. Т.е. результат sizeof и его выражение-операнд в таком случае вычисляются во время выполнения. Например, такой С код не порождает неопределенного поведения (и не пытается менять значение i) int i; sizeof i++; Но вот такой код порождает неопределенное поведение и, если бы значение i было определено, увеличивал бы его на 1 int i; int n = 20; int a[n]; int s = sizeof *(i++, &a); Более компактную версию этого примера можно построить на базе sizeof с аргументом-типом sizeof(char[i]) Результат этого выражения равен значению i. И если i не является константой, то данное выражение вычисляется во время выполнения и порождает неопределенное поведение при неинициализированном i.

Комментариев нет:

Отправить комментарий