-2

このコードの使用:

#include <stdio.h>

void printSize(char *messages[]) {
    printf("%d", sizeof(messages) / sizeof(char *));
}

int main(void) {

    printf("Size when through passing direct to function: ");
    printSize((char *[]){"Zero", "One", "Two", "Three"});
    printf("\n");

    printf("Size when calculating in main: %d\n", sizeof((char *[]){"Zero", "One", "Two", "Three"}) / sizeof(char *));

    return 1;
}

出力が得られます:

Size when through passing direct to function: 1
Size when calculating in main: 4

char* 配列で正しい量の要素を取得する方法がないことは理解していますが、なぜ異なる結果が得られるのか興味があります。

4

2 に答える 2

4
  1. はのchar *messages[]構文糖衣にすぎchar **messagesないため、配列全体のサイズではなく、ポインターのサイズを取得しているだけです。

  2. サイズを別のパラメーターとして渡さないとできません。

Arrays & Pointers の comp.lang.c FAQ セクションを確認してください。

于 2013-08-26T21:25:53.947 に答える
3

配列を関数のパラメーターとして使用すると、配列の最初の要素へのポインターに "減衰" します。messagesは へのポインタの配列であるため、char配列が関数に渡されると、char へのポインタへのポインタになります。これは、パラメーター リストで配列として指定している場合でも発生します。それが言語の仕組みです。

したがって、void printSize()を使用するsizeof(messages)と、ポインタのサイズが得られます。それを別のポインタのサイズで割りますsizeof (char*)。システムでは、ポインターのサイズはどちらの場合も 4 バイトなので、得られる結果は 4 / 4、つまり 1 です。

main()ただし、 では、 の配列は配列としてchar*定義され、配列として扱われます。演算子がsizeof()配列に適用されると、配列全体のすべてのバイトのサイズが取得されます。これは何の配列ですか?への 4 つのポインターの配列ですchar。各ポインタのサイズは 4 です。したがって、配列の合計サイズは 4 * 4 = 16 バイトです。この 16 を、char への 1 つのポインターのサイズである 4 で割ります。したがって、16/4 の結果、つまり の答えとして 4 が得られmain()ます。

于 2013-08-26T21:41:17.143 に答える