web-dev-qa-db-ja.com

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

gCCでコンパイルされた32ビットOS上。

  1. なぜsizeofが文字列リテラルの長さ(必要なスペース)を計算するのですか?
  2. sizeofに指定された場合、文字列リテラルは(char *またはchar []から)異なる型を持っていますか?
46
CsTamas
  1. sizeof("f")は2を返す必要があります。1つは「f」、もう1つは終了する「\ 0」です。
  2. fooはポインターであるため、sizeof(foo)は32ビットマシンでは4、64ビットマシンでは8を返します。
  3. sizeof(bar)は2を返します。これは、barが「b」と終了「\ 0」の2文字の配列であるためです。

文字列リテラルの型は「サイズNのcharの配列」で、Nには終端ヌルが含まれます。

配列は、sizeofに渡されたときにポインターに減衰しません。

109

sizeofは、オペランドのサイズをバイト単位で返します。それは質問番号1に答えるはずです。;)また、文字列リテラルは、sizeofに渡されたとき、「array to n const char」型です。

テストケース、1つずつ:

  • "f"は、文字fと終了NULの2つの文字で構成される文字列リテラルです。
  • fooはポインター(編集:修飾子に関係なく)であり、ポインターはシステム上で4バイト長のようです。
  • barの場合、大文字と小文字は"f"と同じです。

お役に立てば幸いです。

13