Почему sizeof
возвращает 8
. Пожалуйста, объясните?
cout <<sizeof(g2)<<endl;
возвращает 8, потому что g2
является указателем, а размер указателя в вашей среде равен 8.
Почему вывод 1
здесь в g ++ или визуальном C ++?
cout << g2;
У << operator
нет перегруженной версии, которая принимает указатель. Таким образом, указатель преобразуется в тип bool со значением 1, и cout
печатает его.
Стандарт C ++ позволяет это:
C ++ 03 Standard 4.12 Булевы преобразования
1 Значение r арифметики, перечисления, указателя или указателя на тип элемента может быть преобразовано в значение типа bool.
Почему sizeof(C)
печатает 14
, а не 20
в Visual C ++.
cout<<sizeof(C)<<endl;
Отображает размер C
правильно только в шестнадцатеричном (14 in hex
== 20 in decimal
). Это связано с тем, что вы использовали манипулятор ввода / вывода hex
для печати адреса раньше.
cout<<dec<<sizeof(C)<<endl;
снова переведет манипулятор ввода / вывода в десятичный режим и выдаст 20
, как вы ожидаете.
Слово о printf
и типе безопасности:
printf
не является типобезопасным. При использовании printf
пользователь обязан передать ему правильный дескриптор formart и тип данных. В случае несоответствия произойдет неопределенное поведение . Неопределенное поведение означает, что программа может аварийно завершить работу или показать какое-либо странное поведение.
printf ("% p \ n", g2);
Это пример неопределенного поведения, имеется несоответствие в дескрипторе формата и типе данных. Обратите внимание, что компилятор действительно жалуется на это, и вы всегда должны смотреть и проверять такие предупреждения, генерируемые компилятором.
предупреждение: формат "% p" ожидает тип "void *", но аргумент 2 имеет тип "void (C :: *) ()"