在c ++中调整动态数组的大小

时间:2014-07-13 04:03:41

标签: c++ arrays

我有一些代码会产生意想不到的结果。这是代码:

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

}

函数A(int ** arr)可以正常工作,实际上可以调整数组的大小。但是,在main()的最后一个for循环中,当数组正在打印时,数组的前两个元素不是0和1,就像它应该的那样。以下是我得到的结果:

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

每次执行程序时,空格后的前两个整数都不同。经过一些调试后,我发现前两个元素打印正确,直到迭代器i = 13,在第二个中为for循环在main()中。然后数组中的前两个元素占用一些大数。我不确定为什么会这样,我现在已经开展了几个小时的工作:(感谢任何帮助。

2 个答案:

答案 0 :(得分:3)

首先,您的函数A不会调整任何大小。它将换行符打印到标准输出,它将全局size变量乘以2,然后泄漏一些内存。就是这样。

现在,因为它将size乘以2(从10增​​加到20),你遇到了一个问题,在这里:

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

在这里,您尝试访问nums指向的数组的元素10到19。但是nums指向的数组只有10个元素(编号为0到9),所以你的代码有不确定的行为。

答案 1 :(得分:3)

A()未修改nums以指向新数组。即使它是,它正在删除新数组,因此nums最终会指向无效的内存。您需要声明arr参数作为参考,并删除旧数组而不是新数组:

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

对于你的尝试,我认为你有太多的间接性。尝试删除级别:

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

由于你使用的是C ++,你应该使用std::vector而不是原始数组,然后你可以完全消除A()

#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;
}
相关问题