繁体   English   中英

C ++将指针与NULL进行比较

[英]C++ comparing a pointer to NULL

我对C ++很新,所以请耐心等待。

我有以下程序来了解动态内存分配。

#include<iostream>
#include<new>

using namespace std;

int main ()
{
        int i,n;
        int * p;
        cout << "How many numbers would you like to enter? ";
        cin >> i;

        p = new (nothrow) int [i];

        if (NULL == p){
                cout << "Not enough memory!";
        }else{
                for (n=0; n<i; n++){
                        cout << "Enter a number: ";
                        cin >> p[n];
                }
                cout << "You have entered:  ";
                for(n=0; n<i; n++){
                        cout << p[n] << ", ";
                }
                delete[] p;
        }
        return 0;
}

只要最初输入合理的金额,程序就会按预期运行。 但是当输入一个巨大的数字(1000000000000)时,我预计输出“内存不足”,实际上它开始打印“输入一个数字:”大概是100亿次,显然我还没有等待输出。 由于这是检查的“其他”部分,为什么会发生这种情况? 我猜这个比较不起作用。 任何帮助表示赞赏。 谢谢。

如果您输入的第一个数字更多是2 ^ 31,则可能的原因之一如下:

在您提供无效数据后,第一次cin变为无效状态,并且每个下一个数据输入操作(例如>>)都不执行任何操作(因此它不会等待您的输入),除非您明确地将cin返回到正常状态。

您可能的解决方案之一是:添加之后

cin >> p[n];

这段代码:

if (cin.fail()) {
   cout << "Bad data" << endl;
   cin.clear();
}

根据操作系统的不同,即使没有足够的内存,也可以授予对大块内存的请求,希望在需要的时候就足够了(某些进程可能释放了它所拥有的内存,或者更多的交换内存)可能会变得可用)。 在这些系统中,对分配器的调用将成功,但内存将仅在需要时(即,当您使用内存页时)传递给进程,最终在无法分配下一页时触发错误。

这不是C ++的问题,而是操作系统的行为。

首先,正如有人已经注意到的那样,可能实际分配了10亿。 它适合整数(限制大约20亿),它需要你有4GB的内存。

无论如何,在开始打印之前,我建议您打印输入中收到的数字(然后暂停,一秒钟或等待用户输入):该值可能与您预期的不同,因为它可能太大了,无法从cin中正确阅读。

因此,您可能希望将i定义为unsigned long long

unsigned long和unsigned long long有什么区别?

另外,检查你是不是将cin置于错误状态,给出了一个无法解析的字符串

Mooing Duck建议编辑:

使用

 if (std::cin >> variable) { }

要么

 while(std::cin >> variable) { }

避免这个问题。 避免检查.bad() .fail().eof() ,它们经常被误用,导致错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM