2014-12-04 47 views
0

下面的代码似乎当数组声明如下弃土取决于阵列被声明的方式是什么?

int numbers[3] 

工作但是当我尝试宣告它像

int* numbers = new int[3]; 

调整调整大小排列的前两个数字之后似乎迷路。 我真的不能弄清楚是什么betwean两个声明的区别。任何澄清将是有益的。

int main() { 
    int numbers_size = 0; 
    int numbers_capacity = 3; 
    //works when declared like this 
    //does not work when declared like int* numbers = new int[3] 
    int numbers[3]; 
    do { 
    ... 
    if(numbers_capacity == numbers_size) 
     numbers_capacity = resize_array(numbers, numbers_size); 
    }while(numbers[numbers_size - 1] != 0); 
    return 0; 
} 

int resize_array(int* arr, int arr_size) { 
    int* temp = new int[arr_size]; 
    for(int i = 0; i < arr_size; i++) 
    temp[i] = arr[i]; 
    delete [] arr; 
    arr = new int[4*arr_size]; 
    for(int i = 0; i < arr_size; i++) { 
    arr[i] = temp[i]; 
    } 
    delete [] temp; 
    return 4*arr_size; 
} 
+0

这样那样的问题最好解决使用一个体面的调试器,而不是要求对SO一行通过您的代码行步进。 – 2014-12-04 18:04:57

回答

1

你正在改变的arr值在resize_array指向新的存储位置,但调用函数仍然有旧,现在晃来晃去,内存位置。

更改功能:

int* resize_array(int* arr, int arr_size) 
{ 
    int* temp = new int[arr_size]; 
    for(int i = 0; i < arr_size; i++) 
     temp[i] = arr[i]; 

    delete [] arr; // This makes pointer in the calling function 
        // point to deleted memory. 

    arr = new int[4*arr_size]; 
    for(int i = 0; i < arr_size; i++) { 
     arr[i] = temp[i]; 
    } 
    delete [] temp; 

    // Return the newly allocated memory. 
    return arr; 
} 

,并用它喜欢:

numbers_capacity = numbers_size*4; // This is bad. It assumes that 
            // that you are increasing the size by 4 times. 

numbers = resize_array(numbers, numbers_size); 

您可以简单地用一个std::vector<int>,避免所有的头痛。