0

次のエラーの理由が何か知りたいです: 整数配列のサイズを決定しようとしています。

メイン関数で配列のサイズを見つけると、このコードは正しく戻ります。

 int program[12] = { 1007, 1008, 2007, 3008, 2109, 1109, 4300, 0, 0, 0, -99999 };
 cout<<sizeof(program)/sizeof(program[0])<<"\n";

しかし、プログラムを値で関数に渡すと、常に 2 が返されます。

void Sipmletron::load(int program[])
{
    int length=sizeof(program)/sizeof(program[0])
    std::cout<<length<<"\n";
    memory= new int[length];
}
4

4 に答える 4

6

配列を値で渡すことはできません。引数は配列の最初の要素へのポインターとして渡されるため、実際にはsizeof(int*) / sizeof(int).

于 2013-06-06T23:12:40.970 に答える
2

配列が C++ (および C) で渡されると、そのサイズが失われます (または であるかどうかに関係なく、最初の要素のアドレスとして渡されますint *) int []

vector と同様std::arrayのメンバー関数を持つ C++11 を使用している場合に使用できます。size()他のほとんどすべての面では、標準の C スタイルの配列と同じです。

それ以外の場合は、配列とともにサイズを渡す必要があります。または、終了を示すために何らかのマーカーを使用する必要があります (すでに でそれを持っているように見えます-99999)。

于 2013-06-06T23:13:08.343 に答える
1

ここでは、C から直接継承された 2 つの特殊なケースの言語規則が使用されています。

  1. 配列型の式は、ほとんどのコンテキストで、配列の最初の要素へのポインターに暗黙的に変換 (「減衰」) されます。C の例外は、式が単項&またはのオペランドである場合sizeof、または配列 (サブ) オブジェクトを初期化するために使用される初期化子の文字列リテラルである場合です。C++ にはさらに多くの例外がありますが、ここに当てはまるものはありません。

  2. として定義されたパラメーターsome_type foo[]は に「調整」されるsome_type *fooため、パラメーターprogramは実際には配列ではなくポインターです。(この調整は、パラメーター宣言に対してのみ発生します。)

これらのルール (残念ながら私見) が連携して、配列オブジェクトを値で渡し、関数内の配列にアクセスしているように見えますが、実際にはすべてポインターです。

于 2013-06-06T23:21:49.580 に答える