Невозможно прочитать память при попытке увеличить размер массива - PullRequest
0 голосов
/ 11 ноября 2018

Я пытаюсь понять указатели, но у меня возникают проблемы с увеличением размера массива. Я пытаюсь сделать массив, который на один больше стандартного массива, скопировать все, что есть, затем удалить старый массив указателей, создать новый массив указателей, который имеет правильный размер и переместит все обратно из этого временного массива. По какой-то причине у меня появляется сообщение «Невозможно прочитать память», и я понятия не имею, почему.

#include <iostream>

int main()
{
    int number;
    int arraySize = 3;
    bool full;
    int *ptr = new int[arraySize] {0};

do
{
    full = false;
    std::cout << "Input a number please: ";
    std::cin >> number;

    getchar();

    for (int i = 0; i < arraySize; i++)
    {
        if (ptr[i] == 0)
        {
            ptr[i] = number;
            i = arraySize;
        }
        else if(arraySize -1 == i)
        {
            full = true;
        }
    }
    if (full == true)
    {
        int *tempPtr = new int[arraySize+1];
        for (int x = 0; x < arraySize; x++ )
        {
            tempPtr[x] = ptr[x];

        }
        delete[] ptr;
        arraySize++;
        int *ptr = new int[arraySize];
        for (int x = 0; x < arraySize; x++)
        {
            ptr[x] = tempPtr[x];

        }
        ptr[arraySize] = number;

    }



}while(number != -1);
for (int z = 0; z < arraySize; z++)
{
    std::cout << ptr[z] << std::endl;
}

getchar();
return 0;

}

1 Ответ

0 голосов
/ 11 ноября 2018
int *ptr = new int[arraySize];

Это не будет то же самое ptr, что и внешнее ptr, поэтому оно будет вытекать, когда выйдет из области видимости. Должно быть

ptr = new int[arraySize];

Кроме того, не забудьте delete[] ptr перед выходом из программы. Вот немного измененная версия, которую легче прочитать в i.m.o.

#include <iostream>

int main()
{
    int number;
    int arraySize = 3;
    int *ptr = new int[arraySize] {0};
    int i=0;

    do
    {
        std::cout << "Input a number please: ";
        std::cin >> number;
        std::cin.ignore();
        if(number==-1) break; // no need to increase array

        if(i>=arraySize) {
            // the array is full
            int *tempPtr = new int[arraySize+1];
            for (int x = 0; x < arraySize; ++x) tempPtr[x] = ptr[x];
            delete[] ptr;

            // just assign the address tempPtr is pointing at to ptr
            ptr = tempPtr;
            ++arraySize;
        }
        // store the new number  
        ptr[i] = number;
        ++i;
    } while(true);

    for (int z = 0; z < i; z++)
    {
        std::cout << ptr[z] << std::endl;
    }
    delete[] ptr;

    getchar();
    return 0;
}

Обратите внимание, что существуют стандартные контейнеры (std :: vector и т. Д.), Которые более эффективно справляются с динамическим размещением, поэтому вам не нужно писать его самостоятельно.

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