56

次のコード

#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. 文字列リテラルは、与えられたときに(char *またはchar[]とは)異なるタイプになりsizeofますか?
4

2 に答える 2

129
  1. sizeof("f")2を返す必要があります。1つは「f」用で、もう1つは終了する「\0」用です。
  2. sizeof(foo)fooはポインタであるため、32ビットマシンでは4を返し、64ビットマシンでは8を返します。
  3. sizeof(bar)バーは「b」と終了する「\0」の2文字の配列であるため、2を返します。

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

配列は、に渡されたときにポインタに減衰しないことを忘れないでくださいsizeof

于 2009-09-08T05:56:21.847 に答える
14

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

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

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

お役に立てば幸いです。

于 2009-09-08T05:53:10.477 に答える