#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 ? "}" : " " ); }
Комментариев нет:
Отправить комментарий