首页 > 解决方案 > 在使用指针算术时为指针数组赋值给我错误

问题描述

当我做这个指针算术时,它总是给我一个错误


int main()
{
    const int rowSize=40;
    int* unique=nullptr;

    int arr[rowSize]={1,1,11,31,21,22,2,2,3,32,31,3,4,34,45,5,55,5,55,5,6,46,64,6,7,27,74,7,7,7,7,11,11,11,11,11,1,2,13,4};
    int amount=0;

    for (int count=0; count<rowSize; count++)
    {
        if (arr[count]!=arr[count+1])
        {
            amount++;
        }
    }
    unique= new int[amount];
    for (int count=0; count<rowSize-1; count++)
    {
        if (arr[count]!=arr[count+1])
        {
            *unique=arr[count];
            unique++;
        }
    }

    for (int count=0; count<20; count++)
    {
        cout<<unique[count]<<" ";
    }
    cout<<endl;
    delete [] unique;
    unique=nullptr;
    return 0;
}

每次我做这个指针算术,*unique=arr[count] 和 unique++,它总是在最后给我一个时髦的输出。

标签: c++pointers

解决方案


更改new[]操作符返回的指针的值是非常危险的,而且从来都不是编码的正确方法。这是因为,在某些时候,您需要通过delete[]“调用”new[]给您的地址来释放该内存。

在您的情况下,调用您的uniqueArr函数的模块会获得一个返回值,该值将不再(在大多数情况下)是delete[]调用的正确地址,并且会失败。

最好指针上使用[]运算符,使用适当时递增的索引值(当前递增指针的位置)。像这样的东西:

//...
    int* unique = new int[amount];
    size_t uIndex = 0;

    for (int count=0; count<rowSize-1; count++)
    {
        if (arr[count]!=arr[count+1])
        {
            unique[uIndex] = arr[count]; // The [] works fine with a 'new[]' pointer!
            uIndex++; // You could even include this POST-increment inside the [], above!
        }
    }
//... You can now 're-use' "unique" as it will still be the original address.
//...

这样,函数返回的值与new[]操作符返回的值不变,对后续的任何操作都是有效的delete[]

随时要求进一步澄清和/或解释。

编辑:另一种方法(尽管恕我直言不好)方法是使用第二个int*指针来保存 的值,然后在“重新使用”它之前unique恢复到该值(在第二个循环中,或在调用之前)。uniquedelete[]


推荐阅读