1

コンパイラが C 文字列を格納する方法について質問がありますか?コードの一部を次に示します。

#define STRING_MACRO   "macro"
const char * string_const = "w";

int main(void){
    printf("%u\n", sizeof(STRING_MACRO));
    printf("%u\n", sizeof(string_const));

    return 0;
}

出力:

6

4 -- 私のシステムは x86 なので、4 です。

コンパイラがc文字列をどのように格納するかについて混乱していますか?マクロスタイルと値スタイルの間で同じですか?

ほとんどの人が私の質問を誤解していると思うので、自分で別のコードを試してみました。

#define TEST "a"

int main(void)
{
    char hello[] = "aa";
    char (*a)[10] = &hello;

    printf("%u\n", sizeof(TEST));
    printf("%u\n", sizeof(hello));
    printf("%u\n", sizeof(*a));

    return 0;
}

出力:

2
3
10

したがって、コンパイラはマクロ スタイルの c 文字列を char * 型ではなく char[] 型に格納するという結論を得ました。

4

5 に答える 5

3
sizeof(STRING_MACRO);

コンパイラによって次のように認識されます。

sizeof("macro");

これにより、文字列リテラル「マクロ」のサイズが得られます。文字列リテラルは、実装定義の読み取り専用領域に格納されます。


const char * string_const = "w";

string_cost文字列リテラル "w" を指すポインタです。

それで、

sizeof(string_const);

ポインタのサイズを示します。つまり、システム上にconst char *適切に存在4します。

于 2013-03-29T09:48:40.797 に答える
2

sizeof() は、オブジェクトのメモリ サイズを返します。

#define STRING_MACRO   "macro"

これは 6 です。これは、コンパイラが「マクロ」に 6 バイト (5) + (1) を文字列ターミネータに割り当てるためです。

const char * string_const = "w";

これはポインターであるため 4 であり、32 ビット プラットフォームで作業しているため、char へのポインターには 4 バイトです。

于 2013-03-29T09:49:33.677 に答える
2

文字列"macro"は、変数としてではなく、コード内のマクロとして定義されています。

でコードをビルドするgcc -Eと、先行コードが得られます。このコードでは、

printf("%u\n", sizeof(STRING_MACRO);

に置き換えられます

printf("%u\n", sizeof("macro"));

プリプロセッサ コードは、コンパイル前にコンパイラによって生成されたコードです。このコードでは、コンパイラは元のコードのマクロをマクロの内容に置き換えます。

for"w"はリテラル文字列でstring_constあり、そのリテラル文字列を指すポインターです。sizeof ポインターは、32 ビット システムでは 4、64 ビット システムでは 8 です。

于 2013-03-29T09:47:15.733 に答える
0

コンパイラは何も保存しません。解析中に定数のサイズを評価します。のサイズはSTRING_MACRO、文字列の長さ + ターミネータ文字 ( \0) として評価されます。のサイズstring_constはポインターのサイズとして評価され (それがそれであるため)、システムではポインターのサイズは 4 バイトです (32 ビット システムに対応)。

于 2013-03-29T09:49:04.220 に答える
0

2番目のコードでは、

  • TESTコードの一部、つまりリテラルの名前にすぎませんa。この名前は、プリプロセッサ段階で実際のコードに展開されます。
  • すべての文字列リテラルは NULL で終了します。これが理由です、

sizeof("a") =   1   // the size of the character 'a'
              + 1   // size of the '\0' character 
             -----
              = 2

  • "a" と "aa" は、メモリの読み取り専用部分に格納されます (実装が定義されています)。
  • helloスタックに格納され、「aa」が格納されているメモリの読み取り専用部分を指します。
  • は文字配列として宣言されているためhello(サイズが明示的に指定されていないため、サイズは暗黙的に 3 です)、sizeof(hello)= 配列の長さ = 長さ ("aa\0") = 3.
  • a長さ 10 の文字配列へのポインタです。
  • sizeof(a)aはポインターであるため、(x86 システムでは) 4 になります。
  • sizeof(*a)= 10*aは長さ 10 の文字配列のベース ポインターであるためです。
于 2013-03-29T11:24:00.307 に答える