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应该指向 -分配的new内存块(您应该delete[]在 中resize)。

于 2012-10-02T18:03:36.077 回答
7

arr是在堆栈上分配的数组。你不能改变它的大小。如果您需要可调整大小的数组,请使用指针并使用new.

于 2012-10-02T18:03:28.060 回答
1

数组不是指针。特别是,数组保持不变。你不能移动它。在您使用 poibters 的上下文中,您还将创建内存泄漏和越界访问。

要创建可调整大小的数组,您需要维护一个指针,该指针最初是从数组中的元素副本设置的。就个人而言,我不会打扰和使用std::vector<int>(除非我正在开发自己的标准 C++ 库并实现std::vector<T>)。

于 2012-10-02T18:09:02.793 回答
0

当你说它int&意味着一个int我可以改变它的值的变量时,同样当你说它时int*&,它意味着一个int*我可以改变它的值的变量。现在看看你的代码,你能改变arr. 说合法arr = new int[10]吗?你看它是不合法的,在 C++ 术语中它不是一个Lvalue(它不能位于等号运算符的左侧)并且所有非常量引用必须是Lvalue

于 2012-10-02T18:38:41.887 回答
0

你得到你得到的特定错误的原因是它arr会衰减到一个临时int*的使用。然后,您尝试将非常量引用(参数)绑定到临时值,这是非法的。看这里:

为什么非常量引用不能绑定到临时对象?

于 2012-10-02T18:15:53.447 回答