Присвоение значения массиву указателей дает мне ошибку при использовании арифметики указателей - PullRequest
2 голосов
/ 05 мая 2020

Когда я делаю этот указатель arithmeti c, он всегда выдает ошибку


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

Каждый раз, когда я делаю этот указатель arithmeti c, * unique = arr [count] и unique ++, он всегда дайте мне напуганный вывод в конце.

1 Ответ

1 голос
/ 05 мая 2020

Изменение значения указателя, возвращаемого оператором new[], чрезвычайно опасно и никогда не может быть go правильным способом кодирования. Это потому, что в какой-то момент вам нужно будет освободить эту память с помощью delete[] 'call' на адрес, который 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, затем восстановите unique до этого значения перед его «повторным использованием» (через секунду l oop или перед вызовом delete[]).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...