这个指针冲突的原因是什么?

时间:2016-12-04 17:17:52

标签: c++ arrays pointers

也许我只是稍微混淆了一些东西..但请考虑一下这段C ++代码:

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

void printArray(int *arr, int n)
{
    for(int i=0; i<n; ++i)
    cout << arr[i] << " ";

    cout << endl;
}

int main()
{
    list<int*> arrays;
    int times=20, v[9]={1,2,3,4,5,6,7,8,0};

    arrays.push_back(v);

    while(times--)
    {
        int *cur = arrays.front();
        arrays.pop_front();

        printArray(cur, 9);

        int ta[9], tb[9];
        for(int i=0; i<9; ++i)
        {   
            ta[i] = *(cur+i)+1;
            tb[i] = *(cur+i)-1;
        }

        arrays.push_back(&ta[0]);
        arrays.push_back(&tb[0]);
    }

    return 0;
}

正如您所看到的,目标是使用默认数组{1,2,3,4,5,6,7,8,0}进行存储(存储在迭代中) )这个数组的2个变体在int指针列表中。

所以,在第一次迭代中,2个数组{2,3,4,5,6,7,8,9,1}和{0,2,3, ,5,6,7,-1}应该存储在列表中,因此,前3 printArray 应该是:

1 2 3 4 5 6 7 8 0
2 3 4 5 6 7 8 9 1
0 1 2 3 4 5 6 7 -1

现在,发生的事情是前3个 printArray 是:

1 2 3 4 5 6 7 8 0
2 3 4 5 6 7 8 9 1
2 3 4 5 6 7 8 9 1

我已经在每次迭代时打印了 ta tb ,我知道真正打印出来的是 1)默认数组, 2)第一个ta, 3)第一个ta的tb。但我真的不知道这种行为的原因是什么,我的意思是,在每次迭代中,不是 ta tb 新数组(独立于以前的数组)?如果是这种情况,我的只是为新数组位置分配值,那么它们为什么会相互冲突呢?

1 个答案:

答案 0 :(得分:0)

实际上问题很简单。

正如@quimnuss在评论中所述, ta tb 在某些时候被解除分配,因此,保存在列表中的指针将指向与那些完全不同的东西已解除分配的数组,导致程序的行为和未定义的行为。

这句话非常有意义,因为 ta tb 是while循环的局部变量,因此它们的有效性将在每次迭代完成时耗尽。

我们可以通过在每次迭代时动态分配内存来解决此问题,例如:

int *ta = new int[9];
int *tb = new int[9];

这样就不会在每次迭代结束时发生信息丢失,因为这个数组的范围不再是while循环的本地。

最终代码:

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

void printArray(int *arr, int n)
{
    for(int i=0; i<n; ++i)
    cout << arr[i] << " ";

    cout << endl;
}


int main()
{
    list<int*> arrays;
    int times=20;    

    int *v = new int[9];
    for(int i=0; i<8; ++i)
        v[i] = i+1;
    v[8] = 0;

    arrays.push_back(v);

    while(times--)
    {
        int *cur = arrays.front();
        arrays.pop_front();

        printArray(cur, 9);

        int *ta = new int[9];
        int *tb = new int[9];

        for(int i=0; i<9; ++i)
        {   
            ta[i] = *(cur+i)+1;
            tb[i] = *(cur+i)-1;
        }

        arrays.push_back(ta);
        arrays.push_back(tb);

        delete[] cur;
    }

    while(!arrays.empty())
    {
        int *p = arrays.front();
        arrays.pop_front();
        delete[] p;
    }

    return 0;
}