簡體   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