2012-10-02 109 views
2

我有以下一段代码,它是一个数组调整功能的实现。这似乎是正确的,但是当我编译程序,我得到了以下错误:指向int的指针引起错误

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

谁能帮助我?提前致谢。

+0

'void resize(int *&arr' here remove '&' –

+2

@IonutHulub - 这会破坏函数的目的,即改变指针参数指向的数组大小。 –

+0

没有'*&arr'这样的东西。你认为这是一个指针,所以你不能打电话给它,即使你可以,撤销&的效果,一个是供参考,另一个如果是取消引用。 –

回答

8

main,你声明

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

一个普通的数组,不是int*,这是你必须传递给resize什么。

而且,虽然这是不是你的落实resize技术上必要的,因为你永远不delete[]任何分配的内存存在 - 一个空间泄漏你应该修改 - ,你传递给resize应指向new -allocated内存块的指针(你应该delete[]resize)。

+0

不可能调整静态数组的大小,所以这不是一个正确的建议,尽管你确实发现了这个问题。 –

+0

因为将任何'int *'传递给'resize'将会泄漏,但是'resize'会使它指向一个不同的位置(丢失可能是最后一个引用的旧块)。 –

+0

非常感谢。这解释了很多事情。 –

7

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

1

数组是而不是的指针。特别是数组保持不变。你不能移动它。在上下文中,您使用的是poibters,您也会创建内存泄漏和无限制的访问。

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

0

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

+1

'arr'和'new int [10]'可以在等号运算符的右侧,并且所有可变引用都必须是_lvalues_。 –

+0

@MooingDuck感谢您的评论,这是一个简单的错误!我的意思是左值。再次感谢 – BigBoss