Как исправить предупреждения компилятора C6386 и C6385?

Для программы, которую я пишу, мне нужно создать массив с заданным пользователем размером, а также случайными значениями от -15 до 15. Поэтому я использую srand вместе с динамическим преобразованием массива. Это мой полный код ниже:

#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

int main()
{
    //initialize variables
    double minValue;
    double maxValue;
    double firstQuartile;
    double thirdQuartile;
    double skewness;

    int size;
    std::cout << "Please enter the size of the data set: ";                 //get data set size from user
    std::cin >> size;
    int* dataSet = new int[size];                                                           
    cout << endl << "These are the randomly generated values: ";

    srand(static_cast<unsigned int>(time(NULL)));

    int i = size;
    for (int x = 0; x < i; x++)                                         //generate random numbers
    {
        dataSet[i] = (rand() % 31) - 15;
        cout << dataSet[i] << " ";
    }


} 

Хотя он все еще компилируется, мне нужно, чтобы он делал это без ошибок, и раздел, который я выделил ниже, вызывает две ошибки, которые я не знаю, как исправить.

int i = size;
    for (int x = 0; x < i; x++)                                         //generate random numbers
    {
        dataSet[i] = (rand() % 31) - 15;
        cout << dataSet[i] << " ";
    }

C6386 Переполнение буфера при записи в 'dataSet': доступный для записи размер равен 'size*4' байтам, но может быть записано 'i' байтов.

А ТАКЖЕ

C6385 Чтение недопустимых данных из 'dataSet': читаемый размер равен 'size*4' байтам, но можно прочитать 'i' байтов.


person J. Kent    schedule 13.02.2020    source источник
comment
У вас утечка памяти. Вы выделяете динамическую память для массива, но никогда не delete ее.   -  person Thomas Matthews    schedule 14.02.2020


Ответы (1)


В этом цикле индексная переменная x не i.

Так что измените цикл, как

int i = size;
for (int x = 0; x < i; x++)                                         //generate random numbers
{
    dataSet[x] = (rand() % 31) - 15;
    cout << dataSet[x] << " ";
}

На самом деле переменная i избыточна и делает код подверженным ошибкам. Почему бы не написать

for (int i = 0; i < size; i++)                                         //generate random numbers
{
    dataSet[i] = (rand() % 31) - 15;
    cout << dataSet[i] << " ";
}
person Vlad from Moscow    schedule 13.02.2020
comment
Спасибо за быстрый ответ. Однако у меня есть дополнительный вопрос. Мне все еще нужно получить доступ к данным в массиве, который я создал, поэтому должен ли я удалить его в конце программы? - person J. Kent; 14.02.2020
comment
@ J.Kent То, что было выделено с помощью оператора new, должно быть освобождено с помощью оператора delete. В вашем случае вы должны использовать оператор удаления []. - person Vlad from Moscow; 14.02.2020