Подтвердить что ты не робот

Строковый литерал 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?
4b9b3361

Ответ 1

  1. sizeof("f") должен вернуть 2, один для 'f' и один для завершающего '\ 0'.
  2. sizeof(foo) возвращает 4 на 32-битной машине и 8 на 64-битной машине, потому что foo является указателем.
  3. sizeof(bar) возвращает 2, потому что bar - это массив из двух символов: "b" и завершающего "\ 0".

Строковый литерал имеет тип "массив размера N из const char", где N содержит нулевой терминал.

Помните, что массивы не распадаются на указатели при передаче в sizeof.

Ответ 2

sizeof возвращает размер в байтах своего операнда. Это должно ответить на вопрос номер 1.;) Кроме того, строковый литерал имеет тип "массив к n константному символу", когда передан sizeof.

Ваши тестовые примеры, один за другим:

  • "f" является строковым литералом, состоящим из два символа, символ f и завершающий NUL.
  • foo - это указатель (правка: независимо от квалификаторов), а указатели в вашей системе имеют длину 4 байта.
  • Для bar случай такой же, как и для "f".

Надеюсь, это поможет.