无限循环不接受输入
Infinite loop without accepting input
我正在编写一个简单的 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(输入数)等于或小于 20 亿时,该程序按预期运行。但是,当我输入超过 20 亿的任何值(例如 30 亿或更高)时,该程序会进入无限循环,而不会在我的 for 循环中输入数字。
当我为 i 输入一个非常高的值时,我预计这个程序会失败,说它无法分配内存。
根据我的理解,我认为当我输入一个非常高的 int i 值时,我将超出整数数据类型的范围,但在这种情况下,它应该在 for 循环中接受我输入的数字作为我在那里有一个 cin 语句,而不是进入 for 循环,否则内存分配应该简单地失败。
当我将 i 的类型从 int 更改为 long 时它可以工作,但我很想知道 for i 是 int 类型,为什么它进入无限循环而不是在 for 循环中看到 cin 时取值?
我是 运行 这个程序 Mac OS X 并使用 g++ 编译器编译它。
一个32位有符号整数的最大值为2^31-1,即2147483647。
现在,如果您为 Int 变量分配更高的值,则行为非常出乎意料,请尝试查看我实际包含的内容。
顺便说一句,"infinite loop" 是什么意思?程序会崩溃还是永远不会结束执行?
1) 您正在尝试分配给 int
大于 2147483647 的值,这通常是该类型的最大值。
一般来说,如果你想处理这么大的数字,你应该使用long long int
(或者<cstdint>
中的一些东西以获得更好的可移植性)。
2) cin
失败后没有清除状态。
下面的代码生成无限循环:
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
对此的连续记忆。即使你成功分配了数组,它仍然是一个设计问题。您应该使用许多较小的阵列或 use/create 合适的容器。
我正在编写一个简单的 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(输入数)等于或小于 20 亿时,该程序按预期运行。但是,当我输入超过 20 亿的任何值(例如 30 亿或更高)时,该程序会进入无限循环,而不会在我的 for 循环中输入数字。
当我为 i 输入一个非常高的值时,我预计这个程序会失败,说它无法分配内存。
根据我的理解,我认为当我输入一个非常高的 int i 值时,我将超出整数数据类型的范围,但在这种情况下,它应该在 for 循环中接受我输入的数字作为我在那里有一个 cin 语句,而不是进入 for 循环,否则内存分配应该简单地失败。
当我将 i 的类型从 int 更改为 long 时它可以工作,但我很想知道 for i 是 int 类型,为什么它进入无限循环而不是在 for 循环中看到 cin 时取值?
我是 运行 这个程序 Mac OS X 并使用 g++ 编译器编译它。
一个32位有符号整数的最大值为2^31-1,即2147483647。 现在,如果您为 Int 变量分配更高的值,则行为非常出乎意料,请尝试查看我实际包含的内容。
顺便说一句,"infinite loop" 是什么意思?程序会崩溃还是永远不会结束执行?
1) 您正在尝试分配给 int
大于 2147483647 的值,这通常是该类型的最大值。
一般来说,如果你想处理这么大的数字,你应该使用long long int
(或者<cstdint>
中的一些东西以获得更好的可移植性)。
2) cin
失败后没有清除状态。
下面的代码生成无限循环:
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 对此的连续记忆。即使你成功分配了数组,它仍然是一个设计问题。您应该使用许多较小的阵列或 use/create 合适的容器。