Resizing dynamic array in c++

arrays, c++

Solution

`A()` is not modifying `nums` to point at the new array. Even if it were, it is deleting the new array, so `nums` would end up pointing at invalid memory. You need to declare the `arr` parameter as a reference, and delete the old array instead of the new array:

void A(int** &arr)
{
    int **resize;
    resize = new int*[size*2];

    for(int i = 0; i < size; i++)
         resize[i] = new int(*arr[i]);

    cout << endl;
    delete[] arr;
    arr = resize;
    size *= 2;
}

For what you are attempting, I think you have too much indirection. Try removing a level:

#include <iostream>
using namespace std;

int *nums;
int size;

void A(int* &arr)
{
    int *resize;
    resize = new int[size*2];

    for(int i = 0; i < size; i++)
        resize[i] = arr[i];

    cout << endl;
    delete[] arr;
    arr = resize;
    size *= 2;
}

int main()
{
    size = 10;
    nums = new int[size];
    for(int i = 0; i < size; i++)
         nums[i] = i;

    for(int i = 0; i < size; i++)
        cout << nums[i] << endl;

    A(nums);

    cout << endl;
    for(int i = (size / 2); i < size; i++)
        nums[i] = i;

    for(int i = 0; i < size; i++)
        cout << nums[i] << endl;

    delete[] nums;
}

Since you are using C++, you should be using a `std::vector` instead of a raw array, then you can eliminate `A()` altogether:

#include <iostream>
#include <vector>
using namespace std;

vector<int> nums;

int main()
{
    nums.resize(10);
    for(int i = 0; i < nums.size(); i++)
         nums[i] = i;

    for(int i = 0; i < nums.size(); i++)
        cout << nums[i] << endl;

    nums.resize(nums.size()*2);

    cout << endl << endl;

    for(int i = (nums.size() / 2); i < nums.size(); i++)
        nums[i] = i;

    for(int i = 0; i < nums.size(); i++)
        cout << nums[i] << endl;
}

Problem

I have some code that is producing unexpected results. Here is the code: ``` #include <iostream> using namespace std; int **nums; int size; void A(int** arr) { int **resize; resize = new int*[size*2]; for(int i = 0; i < size; i++) resize[i] = new int(*arr[i]); cout << endl; arr = resize; size *= 2; delete[] resize; } int main() { size = 10; nums = new int*[size]; for(int i = 0; i < size; i++) nums[i] = new int(i); for(int i = 0; i < size; i++) cout << *nums[i] << endl; A(nums); cout << endl; for(int i = (size / 2); i < size; i++) nums[i] = new int(i); for(int i = 0; i < size; i++) cout << *nums[i] << endl; } ``` The function A(int** arr) works fine as far as I can tell and actually resizes the array. However, in the last for loop in main(), when the array is printing, the first two elements of the array are not 0 and 1 like it is supposed to be. Here is the result I am getting: ``` 0 1 2 3 4 5 6 7 8 9 16331248 16331712 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ``` Those first two ints after the space are different each time the program is executed. After some debugging I found out that the first two elements print correctly until the iterator i=13 in the second to last for loop in main(). Then the first two elements in the array take on some large numbers. I am not sure why this is happening and I have been working on this for a couple of hours now :( Any help is appreciated.

Original source