Динамическое выделение памяти и повреждение кучи - PullRequest
0 голосов
/ 06 мая 2019

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

Если бы кто-то мог точно указать, что я делаю неправильно, и объяснить это мне, чтобы я мог учиться на своих ошибках, я был бы очень признателен. Спасибо!

#include <stdlib.h>
#include <iostream>
#include <time.h>

int* createArray(int);
int* splice(int[], int[], int, int, int);
void arrayPrint(int []);

using namespace std;

int main(void)
{
    int firstLength, secondLength, copyLength;

    cout << "Enter the length of the first array: ";
    cin >> firstLength;
    cout << "Enter the length of the second array: ";
    cin >> secondLength;
    cout << "Enter the length of the first array to be copied: ";
    cin >> copyLength;

    int* firstArray;
    int* secondArray;
    int* thirdArray;

    srand(100);

    firstArray = createArray(firstLength);
    secondArray = createArray(secondLength);

    firstArray = new int[firstLength];
    for (int i = 0; i < firstLength; i++)
        firstArray[i] = rand() % 100;
    secondArray = new int[secondLength];
    for (int i = 0; i < secondLength; i++)
        secondArray[i] = rand() % 100;

    thirdArray = splice(firstArray, secondArray, firstLength, secondLength, copyLength);

    cout << "First Array: " << endl;
    for (int i = 0; i < firstLength; i++)
    {
        cout << firstArray[i] << ", ";
    }
    arrayPrint(firstArray);
    cout << endl << "Second Array: " << endl;
    for (int i = 0; i < secondLength; i++)
    {
        cout << secondArray[i] << ", ";
    }
    arrayPrint(secondArray);
    cout << endl << "Spliced Array: " << endl;
    arrayPrint(thirdArray);

    delete firstArray;
    delete secondArray;
    delete thirdArray;
    system("pause");
    return 0;
}

int* createArray(int arrayLength)
{
    int* createdArray;
    createdArray = new int[arrayLength];
    for (int i = 0; i < arrayLength; i++)
        createdArray[i] = rand();
    return createdArray;
}

int* splice(int firstArray[], int secondArray[], int firstLength, int secondLength, int copyLength)
{
    int* splicedArray;
    splicedArray = new int[copyLength];
    for (int i = 0; i < copyLength; i++)
    {
        splicedArray[i] = firstArray[i];
    }
    for (int j = 0; j < secondLength; j++)
    {
        splicedArray[j + copyLength] = secondArray[j];
    }
    for (int k = 0; k < firstLength - copyLength; k++)
    {
        splicedArray[k + copyLength + secondLength] = firstArray[k + copyLength];
    }
    return splicedArray;
}

void arrayPrint(int toPrint[])
{
    for (int i = 0; i < sizeof(toPrint) / sizeof(*toPrint); i++)
    {
        if ((i % 10) == 9)
            cout << toPrint[i] << endl;
        else
            cout << toPrint[i] << ", ";
    }
}

1 Ответ

0 голосов
/ 06 мая 2019

Сочетая ответ C_Raj, комментарии Винодсалуйи и Wander3r:

Вы выделяете первый и второй массивы дважды, достаточно одного раза, на самом деле больше - утечка памяти (винодсалуйя).Логически, так как третий массив представляет собой комбинацию первого и второго массивов, его длина должна быть суммой обеих длин массива, которая равна первой длине + второй длине, а не длине копии.Вот где происходит повреждение кучи (винодсалуйя).Наконец, нужно освободить арены с помощью delete [] (Wander3r).

Код C_Raj - вот какой должен быть результат, поэтому я не копирую его.

...