1

'sizeof'配列を計算したい:

char* arr[] = { "abc", "def" };

手動で呼び出すsizeofと、配列の初期化直後に正常に動作します。ただし、配列を関数に渡すと、同じ結果は得られません。

int test(char* b[]) {
    return (int)sizeof(b);
}

int _tmain(int argc, _TCHAR* argv[])
{
    char* arr[] = { "abc", "def" };
    int p = test(arr); // gives 4
    int k = sizeof(arr); // gives 8
    ...
}

だから問題は何ですか?初心者の質問で申し訳ありませんが、私は本当にそれが恋しいです。

4

5 に答える 5

3

sizeofon arrinを使用すると、アーキテクチャ上に_tmainある配列自体のサイズが取得されます。これは、s がビット =バイトを占めるためです。2 * sizeof(char*) = 2 * 4 = 8char*324

onでsizeofonを使用すると、アーキテクチャ上にある配列の最初の要素へのポインターのサイズが取得されます。配列ではなくポインターのサイズを取得している理由は、配列をそのまま関数に渡すことができないためです。代わりに、ポインターを介して最初の要素に渡します。したがって、配列の実際のサイズに関する情報は、呼び出しで失われます。別の言い方をすれば、関数のシグネチャは と同等です。btestsizeof(char**) = 4testint test(char **b)

于 2012-04-08T15:23:53.730 に答える
2

これは、C または C++ で関数を呼び出すと、配列がポインターに分解されるためです。

最初のケースでは、コンパイラはarr配列として認識します。2 番目のケースでは、ポインタへのポインタだけが表示されます。

于 2012-04-08T15:23:19.093 に答える
0

C++へようこそ。

配列を関数に渡すことはできません。C ++では、ほとんどの場合、配列はポインターに減衰します。配列を渡そうとしていますが、実際にはポインターを渡そうとしています。2番目sizeofの値は、そのポインターのサイズに評価されます。

これについては気にしないでください。配列は特殊な低レベルのデータ構造であり、高レベルの抽象化を実装するためにのみ使用する必要があります。std::vector代わりに使用してください。

于 2012-04-08T15:31:26.087 に答える
0

test が定義されている時点で、コンパイラは b が何を指しているかを認識できません。したがって、sizeof はポインターのサイズ (実際には、ポインターへのポインターのサイズ) を示します。

main の中では、実際のサイズが 2 つのポインターであることがよくわかります。

配列を関数に渡すようなものは実際にはありません - 配列へのポインタのみが渡されます。[] 形式は単なるシンタックス シュガーです。

于 2012-04-08T15:23:31.187 に答える
0

test配列がポインターに減衰するため、呼び出し時にサイズ情報が失われます。

配列のサイズを追加のパラメーターとして渡すか、パラメーターの型で修正する必要があります。

于 2012-04-08T15:23:36.747 に答える