が指すメモリのサイズではなく、sizeof()
がint pointer
のバイトを返さないので、関数は配列を初期化できません。ポインタによって渡された配列を初期化する
void assignArray(int *myArray)
{
for(int k = 0; k < sizeof(myArray); ++k)
{
myArray[k] = k;
}
}
他にも問題がありますか?
ありがとうございました
が指すメモリのサイズではなく、sizeof()
がint pointer
のバイトを返さないので、関数は配列を初期化できません。ポインタによって渡された配列を初期化する
void assignArray(int *myArray)
{
for(int k = 0; k < sizeof(myArray); ++k)
{
myArray[k] = k;
}
}
他にも問題がありますか?
ありがとうございました
その他の問題はありません。しかし、あなたはおそらくこの欲しかっ:ない限り
template<int sz>
void assignArray(int (&myArray)[sz])
{
for(int k = 0; k < sz; ++k)
{
myArray[k] = k;
}
}
を、当然のことながら、でもコンパイラ doens'tは、コンパイル時にどのように大きな知っています。この場合、サイズを明示的に渡す必要があります。
void assignArray(int* myArray, size_t sz)
{
for(int k = 0; k < sz; ++k)
{
myArray[k] = k;
}
}
あなたはサイズがわからない場合は、設計エラーを持っています。
しかし、これは、OPが配列を割り当てている場合は動作しません – Praetorian
ダーン - 30秒で私を打つ! –
@Praetorian:私は彼が上記のコードから推測しました。私は答えの後半を掲載しました。 –
いいえ、他に問題はありません。あなたが述べた問題は、配列の初期化を止める唯一の事です。私はサイズを格納するための標準的なタイプであるため(それは8になりますサイズにstd::size_t
を使用した
void assignArray(int* myArray, std::size_t mySize)
{
for (std::size_t k = 0; k < mySize; ++k)
myArray[k] = k;
}
注
典型的には、これは、単にポインタと一緒にサイズを渡すことによって解決されます。バイトは64ビットマシンで、一方、int
は通常はありません)。
サイズは静的に知られている場合、いくつかのケースでは、その後、テンプレートを使用することができますが:
template <std::size_t Size>
void assignArray(int (&myArray)[Size])
{
for (std::size_t k = 0; k < Size; ++k)
myArray[k] = k;
}
しかし、これが唯一の配列ではなく、割り当てられた配列へのポインタで動作します。
int array1[1000];
int* array2 = new int[1000];
assignArray(array1); // works
assignArray(array2); // error
+1、有用で、馬鹿げた、素直な答え... – StevieG
あなたは区別することができるはずの配列の2つのタイプがあります。一つは、次のようになります。
type name[count];
この配列は、各count
に異なるタイプであるタイプtype[count]
です。それはtype *
に変換可能ですが、それは異なります。 1つの違いはsizeof(name)
は、アレイの他のタイプは次のようになりますあなたのcount*sizeof(type)
を与えるということである。
基本的にあなたがmalloc
またはnew
と例えば配列を初期化することができ、単にポインタである type *name;
。この変数のタイプはtype *
です。ご覧のとおり、タイプにはの情報がありません。の数がありません。したがって、sizeof(name)
は、コンピュータのポインタのサイズを示します(4または8バイトなど)。
なぜこれらの2つが異なるのですか? sizeof
はコンパイル時に評価されるためです。あなたがsizeof(name)
を言うとき、コンパイラはn
の将来価値を知ることができない、今
int n;
cin >> n;
type *name = new type[n];
:次のコードを考えてみましょう。したがって、配列の実際のサイズとしてsizeof(name)
を計算することはできません。また、name
ポインタは配列を指さないかもしれません!
あなたは何をすべきですか?シンプル。変数の配列のサイズを保持し、配列のどこかにドラッグします。したがって、あなたの場合は次のようになります:
void assignArray(int *myArray, int size)
{
for(int k = 0; k < size; ++k)
{
myArray[k] = k;
}
}
何か他のことは期待していますか? –
「それ以外に、リンカーン夫人の遊びはどうでしたか?」 –
それはおそらくあなたがその大きな問題を最初に修正し、その新しい修正版に他の問題があるのか疑問に思うなら、おそらく一番です。 –