Страницы

Поиск по вопросам

воскресенье, 29 декабря 2019 г.

Если вводить массив больше 5 или более чисел крашится программа, почему?

#cpp


#include 
#include 
#include 
int main()
{
    srand(time(NULL))
    int n;
    std::cout << "long? = ";
    std::cin >> n;
    float *arr = new float(n);
    for (int i = 0; i < n; i ++ )
    {
        arr[i] = rand() % 100;
    }
    std::cout << "original array:\n arr = {";
    for (int i = 0; i < n; i++)
    {
        int u = i + 1;
        if (u == n) std::cout << arr[i] << "}";
         else std::cout << arr[i] << " ";
    }
    _getch();
    return 0;
}

    


Ответы

Ответ 1



Потому что ваш код float *arr = new float(n); Выделяет память под одну переменную типа float и инициализирует ее числом n. Правильный код выделения памяти под массив: float *arr = new float[n]; не забудьте в конце программы освободить память: delete[] arr;

Ответ 2



Если отвечать именно на этот вопрос Если вводить массив больше 5 или более чисел крашится программа то причина следующая. В этом предложении float *arr = new float(n); вы запросили память для одного объекта типа float и инициализировали его значением n. Скорей всего размер объекта типа float составляет 4 байта ( sizeof( float) ). Однако система обычно не выделяет участки памяти такого малого размера. Обычно выделяются участки памяти, выравненные по параграфу (16 байт) и размером также в один параграф, то есть в 16 байт. Поэтому если вы по ошибке напишите код for (int i = 0; i < 4; i ++ ) { arr[i] = rand() % 100; } то вполне возможно, что программа будет работать без проблем, так как запись будет производиться в выделенный участок памяти. Хотя в любом случае на это полагаться нельзя, и следует рассматривать данную программу, как имеющую неопределенное поведение. Поэтому конечно нужно исправить опечатку и написать правильно float *arr = new float[n]; так как n может быть произвольным числом, а не только равным 1 или 4. В этом случае вам перед завершением программы следует освободить выделенную память оператором delete [] delete []arr; Следует также включить заголовок , так как именно в этом заголовке объявляется функция std::srand #include И лучше использовать квалификатор std:: для стандартных C-функций, так как стандарт C++ не гарантирует, что эти функции будут помещены в глобальное пространство имен. Поэтому лучше написать std::srand( ( unsigned int )std::time( NULL ) ); То же самое справедливо для функции std::rand Цикл for (int i = 0; i < n; i++) { int u = i + 1; if (u == n) std::cout << arr[i] << "}"; else std::cout << arr[i] << " "; } можно было бы записать проще. Например, for (int i = 0; i < n; i++) { std::cout << arr[i] << ( i == n - 1 ? "}" : " " ); }

Комментариев нет:

Отправить комментарий