2

次のコードがあります。これは、配列のサイズ変更関数の実装です。正しいようですが、プログラムをコンパイルすると、次のエラーが発生します。

g++ -Wall -o "resizing_arrays" "resizing_arrays.cpp" (in directory: /home/aristofanis/Desktop/coursera-impl)
resizing_arrays.cpp: In function ‘int main()’:
resizing_arrays.cpp:37: error: invalid initialization of non-const reference of type ‘int*&’ from a temporary of type ‘int*’
resizing_arrays.cpp:7: error: in passing argument 1 of ‘void resize(int*&, int, int, int)’
resizing_arrays.cpp:39: error: invalid initialization of non-const reference of type ‘int*&’ from a temporary of type ‘int*’
resizing_arrays.cpp:7: error: in passing argument 1 of ‘void resize(int*&, int, int, int)’
resizing_arrays.cpp:41: error: invalid initialization of non-const reference of type ‘int*&’ from a temporary of type ‘int*’
resizing_arrays.cpp:7: error: in passing argument 1 of ‘void resize(int*&, int, int, int)’
Compilation failed.

コードは次のとおりです。

int N=5;

void resize( int *&arr, int N, int newCap, int initial=0 ) { // line 7
  N = newCap;
  int *tmp = new int[ newCap ];
  for( int i=0; i<N; ++i ) {
    tmp[ i ] = arr[ i ];
  }
  if( newCap > N ) {
    for( int i=N; i<newCap; ++i ) {
      tmp[ i ] = initial;
    }
  }

  arr = new int[ newCap ];

  for( int i=0; i<newCap; ++i ) {
    arr[ i ] = tmp[ i ];
  }
}

void print( int *arr, int N ) {
  for( int i=0; i<N; ++i ) {
    cout << arr[ i ];
    if( i != N-1 ) cout << " ";
  }
}

int main() {
  int arr[] = { 1, 2, 3, 4, 5 };

  print( arr, N );
  resize( arr, N, 5, 6 ); // line 37
  print( arr, N);
  resize( arr, N, 10, 1 ); // line 39
  print( arr, N );
  resize( arr, N, 3 ); // line 41
  print ( arr, N );

  return 0;
}

誰か助けてもらえますか?前もって感謝します。

4

5 に答える 5

8

main、あなたは宣言します

int arr[] = { 1, 2, 3, 4, 5 };

int*に渡さなければならないものである、ではなく、通常の配列resize

そして、それはの実装には技術的に必要ではありませんが、そこに割り当てられたメモリresizeは決してないのでdelete[](修正する必要のあるスペースリーク)、渡すポインタは割り当てられたメモリブロック(である必要があります)resizeを指している必要があります。newdelete[]resize

于 2012-10-02T18:03:36.077 に答える
7

arrスタックに割り当てられた配列です。サイズを変更することはできません。サイズ変更可能な配列が必要な場合は、ポインターを使用して、。を使用して配列を割り当てますnew

于 2012-10-02T18:03:28.060 に答える
1

配列はポインタではありません。特に、アレイはそのままです。動かせない。poibterを使用しているコンテキストでは、メモリリークや範囲外のアクセスも発生します。

サイズ変更可能な配列を作成するには、配列内の要素のコピーから最初に設定されるポインターを維持する必要があります。個人的には、わざわざ使用することはありませんstd::vector<int>(独自の標準C ++ライブラリで作業して実装している場合を除きますstd::vector<T>)。

于 2012-10-02T18:09:02.793 に答える
0

発生している特定のエラーが発生する理由は、使用arr時に一時的に減衰するためint*です。次に、非定数参照(パラメーター)を一時的なものにバインドしようとしますが、これは不正です。ここを参照してください:

非定数参照が一時オブジェクトにバインドできないのはなぜですか?

于 2012-10-02T18:15:53.447 に答える
0

あなたが言うとき、それは私がその値を変えることができる変数をint&意味しintます、あなたが言うときと同じようにint*&、それは私がその値を変えることができる変数を意味int*します。次に、コードを見て、の値を変更できますかarr。言うことは合法arr = new int[10]ですか?あなたはそれが合法ではないことを見るでしょう、C ++用語ではそれはそうではなくLvalue(等しい演算子の左側に置くことはできません)そしてすべての非定数参照はLvalue

于 2012-10-02T18:38:41.887 に答える