C++比较指针与NULL的方法

3

我对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)时,我期望输出“内存不足”,但实际上它开始打印“输入一个数字:”,可能是1000000000000次,显然我没有等待输出。既然这在"else"检查的部分,为什么会发生这种情况?我猜测比较不起作用了。任何帮助都将不胜感激。谢谢。

1
你可能需要检查一下你发布的代码。看起来复制粘贴时出现了一些问题。 - David Rodríguez - dribeas
1
如果你从这段代码编译一个64位程序,它应该能够愉快地分配4GB的内存来容纳十亿个整数。 - Adam
1
@TaylorBrandstetter:当然,如果你输入 if (!p),那就没有任何问题了,而且它也很易读(无需使用 Yoda 编程)。 - David Rodríguez - dribeas
3
许多编译器警告设置不够高的人认为这是良好的做法,将...放在那里,FTFY :) - Praetorian
1
我在我的VS2010上运行了这段代码。一切都正常工作。 - Alexandru Barbarosie
显示剩余8条评论
3个回答

2
如果您输入的第一个数字超过2^31,可能的原因之一是以下情况:
在您第一次提供无效数据后,cin就变成了无效状态,并且每个下一个数据输入操作(例如>>)都不起作用(因此它不等待您的输入),除非您明确将cin返回到正常状态。
您可以尝试以下解决方案之一:在...之后添加。
cin >> p[n];

这段代码:

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

这就是全部,谢谢。在遇到 cin 进入错误状态的概念之前,我完全不知道。 - Matt Pellegrini

1
根据操作系统的不同,即使内存不足,对大块内存的请求也可能会被批准,希望到需要时会有足够的内存(某些进程可能已释放了它所持有的内存,或者更多的交换内存可能变得可用)。在这些系统中,分配器的调用将成功,但只有在需要时(即当您使用内存页面时)才会将内存交给进程,最终在无法分配下一页时触发故障。
这不是C ++的问题,而是操作系统的行为问题。

有趣的知识,但这并没有真正回答问题。程序不会像请求授予的内存量一样等待用户输入,它只是开始打印“输入一个数字”,而不等待输入。我将研究下面的答案并发布一些结果。 - Matt Pellegrini
@MattPellegrini 知道如何提问非常重要。问题似乎是在解析输入时出现了错误,但原始问题中的数字在大多数当前架构中都可以正确解析为整数。提供错误的代码或输入并不能帮助您获得答案,反而会浪费他人的时间。 - David Rodríguez - dribeas

1

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

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

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

unsigned long和unsigned long long之间的区别是什么?

此外,请检查您是否在将无法解析的字符串放入cin时将其置于错误状态

来自Mooing Duck建议的编辑:

使用

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

or

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

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


1
谢谢,问题已解决。原来数字太大了,int 无法处理,所以 cin 不能正常工作。使用 long 类型解决了这个问题,现在输出的是“内存不足”,一切正常。感谢大家。 - Matt Pellegrini
1
@MattPellegrini:通常,我们使用 if (std::cin >> variable) { }while(std::cin >> variable) { 来避免这个问题。避免检查 .bad().fail().eof(),它们经常被误用,导致错误。 - Mooing Duck
@MooingDuck,他们被谁误用了?如果是这样的话,那很不幸,但这迫使开发人员学会正确使用它们。 - Adrian
bln 代表什么?我以前从来没见过。 - Adrian
2
@Adrian 不用等,就是Antonio链接的那段代码。新规则,对话中每个人的名字必须以不同的字母开头。 - Mooing Duck
显示剩余11条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接