2015-02-15 2 views
1

Я пишу простую программу на C++, которая выделяет динамическую память для моей Программы, а затем удаляет эту память. Вот моя программа:Бесконечный цикл без принятия ввода

#include <iostream> 
#include <new> 
using namespace std; 

int main() 
{ 
    int i,n; 
    int * p; 
    cout << "How many numbers would you like to type? "; 
    cin >> i; 
    p= new (nothrow) int[i]; 
    if (p == nullptr) 
    cout << "Error: memory could not be allocated"; 
    else 
    { 
    for (n=0; n<i; n++) 
    { 
     cout << "Enter number: "; 
     cin >> p[n]; 
    } 
    cout << "You have entered: "; 
    for (n=0; n<i; n++) 
     cout << p[n] << ", "; 
    delete[] p; 
    } 
    return 0; 
} 

В приведенной выше программе, когда я ввода значение I (Количество входов), равный или меньше, чем 2 миллиарда, чем эта программа работает, как ожидалось. Однако, когда я ввожу что-либо выше 2 миллиардов, как 3 миллиарда или выше, эта программа переходит в бесконечный цикл без ввода числа в мой цикл for.

Я ожидаю, что эта программа потерпит неудачу, когда я введу очень высокое значение для i, заявив, что не может выделить память.

Как я понимаю, когда я вхожу в очень высокое значение int i, я выхожу из привязанного к целочисленному типу данных, но все же в этом случае он должен принимать числовые данные от меня в цикле, поскольку я есть инструкция cin там вместо того, чтобы идти в цикл или распределение памяти, должно потерпеть неудачу просто.

Когда я изменил тип i из int в long, тогда он работает, но мне любопытно узнать для i типа int, почему он идет в бесконечном цикле вместо того, чтобы принимать значения, когда видит cin in for loop?

Я запускаю эту программу на Mac OS X и компилирую ее с помощью компилятора g ++.

+0

Предположим, что даже если я становится -1, тогда в этом случае мой цикл для ввода номера не должен выполняться вообще, а затем программа должна завершиться, правильно? Думаю, он не должен идти в бесконечном цикле? –

+1

Это не ответ, но поскольку вы хотите, чтобы пользователь вводил позитивные числа, вы должны использовать 'unsigned int' или, возможно,' unsigned long' вместо 'int'. – Cyclonecode

+0

Вы пытались проверить значение i в отладчике или написать его cout? –

ответ

0

1) Вы пытаетесь присвоить значение int больше, чем 2147483647, что обычно является максимальным значением для этого типа. Как правило, если вы хотите обрабатывать такие большие числа, вы должны использовать long long int (или что-то от <cstdint> для лучшей переносимости).

2) Вы не очистили состояние cin после его отказа. Код bollow генерировать бесконечный цикл:

int i = 0; 
while (i <= 0) 
{ 
    std::cout << "Enter a number greater than 10..." << std::endl; 
    std::cin >> i; 
} 

Вы можете решить это следующим образом:

int i = 0; 
while (i <= 0) 
{ 
    std::cout << "Enter a number greater than 10..." << std::endl; 
    if (!(std::cin >> i)) 
    { 
     std::cin.clear(); // Clear error flag 
     std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // Remove incorrect data from buffer 
    } 
} 

3) Вы пытаетесь создать действительно большой массив. Для этого вам понадобится несколько GiB . Даже если вам удастся выделить массив, это все еще проблема дизайна. Вы должны использовать множество меньших массивов или использовать/создать подходящий контейнер.

+0

Вы имеете в виду максимальное значение 'int' для данного конкретного компилятора. Вы должны использовать 'std :: cin.ignore (std :: numeric_limits :: max(), '\ n');', чтобы очистить весь буфер. Почему не меньший 'if (! (Std :: cin >> i))'? # 3 зависит. Я выделил массивы с несколькими гигабайтами раньше для специальных целей. –

+0

Хорошие наблюдения. Я изменю его. –

+0

@NeilKirk Третий пункт не исправлен, потому что я по-прежнему считаю, что выделение такого большого массива является проблемой дизайна. Это не так сложно написать собственный контейнер, который ведет себя как обычный массив. –

0

Максимальное значение 32-разрядного целого знака со знаком составляет 2^31-1, а именно 2147483647. Теперь, если вы назначаете большее значение переменной Int, поведение довольно неожиданно, попробуйте и посмотрите, что я на самом деле содержит.

КТО, что вы подразумеваете под «бесконечной петлей»? Сбой программы или ее завершение?

+0

Это не сбой. Я продолжаю печатать строку «Введите номер:» бесконечно, не прерывая или не ожидая ввода cin. –

+0

Я напечатал значение i, и оно показано как 2147483647, что является наивысшим возможным значением для подписанного int. Но все же он не должен идти в бесконечном цикле. Кажется, что что-то не так с моим объектом cin, как указано в @indiv выше. –

+1

@PrabhashRathore Вы уверены, что это действительно бесконечный цикл, а не только цикл из нескольких миллиардов? –

Смежные вопросы