2011-10-17 10 views
0

が指すメモリのサイズではなく、sizeof()int pointer のバイトを返さないので、関数は配列を初期化できません。ポインタによって渡された配列を初期化する

void assignArray(int *myArray) 
{ 
    for(int k = 0; k < sizeof(myArray); ++k) 
    { 
     myArray[k] = k; 
    } 
} 

他にも問題がありますか?

ありがとうございました

+3

何か他のことは期待していますか? –

+1

「それ以外に、リンカーン夫人の遊びはどうでしたか?」 –

+0

それはおそらくあなたがその大きな問題を最初に修正し、その新しい修正版に他の問題があるのか​​疑問に思うなら、おそらく一番です。 –

答えて

3

その他の問題はありません。しかし、あなたはおそらくこの欲しかっ:ない限り

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; 
    } 
} 

あなたはサイズがわからない場合は、設計エラーを持っています。

http://codepad.org/Sj2D6uWz

+0

しかし、これは、OPが配列を割り当てている場合は動作しません – Praetorian

+0

ダーン - 30秒で私を打つ! –

+0

@Praetorian:私は彼が上記のコードから推測しました。私は答えの後半を掲載しました。 –

6

いいえ、他に問題はありません。あなたが述べた問題は、配列の初期化を止める唯一の事です。私はサイズを格納するための標準的なタイプであるため(それは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

+1、有用で、馬鹿げた、素直な答え... – StevieG

0

あなたは区別することができるはずの配列の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; 
    } 
} 
関連する問題