Строковый литерал sizeof
Следующий код
#include <iostream>
using namespace std;
int main()
{
const char* const foo = "f";
const char bar[] = "b";
cout << "sizeof(string literal) = " << sizeof( "f" ) << endl;
cout << "sizeof(const char* const) = " << sizeof( foo ) << endl;
cout << "sizeof(const char[]) = " << sizeof( bar ) << endl;
}
выходы
sizeof(string literal) = 2
sizeof(const char* const) = 4
sizeof(const char[]) = 2
на 32-битной ОС, скомпилированной с помощью GCC.
- Почему
sizeof
вычисляет длину (пространство, необходимое для) строкового литерала?
- Имеет ли строковый литерал другой тип (от char * или char []) при задании
sizeof
?
Ответы
Ответ 1
sizeof("f")
должен вернуть 2, один для 'f' и один для завершающего '\ 0'.
sizeof(foo)
возвращает 4 на 32-битной машине и 8 на 64-битной машине, потому что foo является указателем.
sizeof(bar)
возвращает 2, потому что bar - это массив из двух символов: "b" и завершающего "\ 0".
Строковый литерал имеет тип "массив размера N из const char
", где N содержит нулевой терминал.
Помните, что массивы не распадаются на указатели при передаче в sizeof
.
Ответ 2
sizeof
возвращает размер в байтах своего операнда. Это должно ответить на вопрос номер 1.;) Кроме того, строковый литерал имеет тип "массив к n константному символу", когда передан sizeof
.
Ваши тестовые примеры, один за другим:
"f"
является строковым литералом, состоящим из
два символа, символ f
и завершающий
NUL.
foo
- это указатель (правка: независимо от квалификаторов), а указатели в вашей системе имеют длину 4 байта.
- Для
bar
случай такой же, как и для "f"
.
Надеюсь, это поможет.