2012-03-09 52 views
1

我在C++中遇到了一個問題。我讀了一些代碼,但有一個非常有線的使用指針。代碼如下:在C++中大於零的指針,是什麼意思?

double* marginalProbability = 
    new double [10 * sizeof(marginalProbability[0])]; 
    memset(marginalProbability, 0, 10 * sizeof(double)); 
    //................ 
      //................. 
    if(marginalProbability>0) 
     printf("larger"); 
    else 
     printf("smaller"); 

我要問的問題是什麼呢意味着if(marginalProbability>0)。它是一個大於零的指針。我認爲在一個普通的編譯器中,沒有地址等於零。或者還有其他含義嗎?否則,這條線似乎毫無意義。謝謝。

+1

看起來像他們的意思'if(* marginalProbability> 0)' – Almo 2012-03-09 16:33:28

+5

數組的新運算符會自動計算元素的大小,所以它應該是一個10'雙精度數組'的新double [10] 。你現在可能分配了80個雙打的東西。另外,std :: fill(marginalProbability,marginalProbability + 10,0.0);'memset()'更方便。 – 2012-03-09 16:35:49

+0

@AndréCaron:''new double [10]()'比'std :: fill()'方便。 – 2012-03-09 16:46:01

回答

0

值爲零的指針是空指針。一個指向什麼都沒有。檢查它不是零(p!= 0比p> 0更常見,儘管p!= nullptr是最正確的)意味着它不爲空。

您列出的代碼也是錯誤的。如果新操作失敗,它不會返回空指針,但會拋出一個不會被捕獲的異常。

這就是它應該是。

try{ 
    std::vector<double> marginalProbability (10, 0.0); 
}catch(const std::bad_alloc& e){ 
    std::cerr << "no memory" << std::endl; 
} 
+0

但是,如果指針有效,他們爲什麼要打印「較大」,如果它無效則打印「較小」? – Almo 2012-03-09 16:34:40

+0

我不知道。除非他們說它可能更大(因爲它適合內存),或者如果它適合內存,它必須更小。代碼真的看起來不太好吃。 – 111111 2012-03-09 16:39:08

+0

我非常失望的代碼(當然,我改變了一些不重要的行)是來自opencv。 – fskking 2012-03-09 17:00:10

0

有指針是0。它們顯式地是指向沒有當前有效對象的「空」指針。但是,在這種情況下使用</>是非常沒有意義的 - 例如,沒有像1指針那樣的東西。

另外,這是假裝C++的C代碼。

2

在這種情況下,0被解釋爲空指針常量。

您可以比較兩個指針,但結果是未指定的,除非它們指向相同數組的兩個元素;因此代碼格式良好但沒有意義。

我懷疑代碼是應該比較概率值,*marginalProbabilitymarginalProbability[i],與零。如果它是用來檢查分配是否成功,那麼它是錯的,原因有三:

  • 那就要使用!=,因爲>的結果是不確定的;
  • 它必須在memset()之前完成;
  • 只有在使用配置時才需要new (std::nothrow);原因new失敗時拋出std::bad_alloc
4

NULL指針被視爲零。這就是說,這段代碼可能只是錯誤的,因爲比較保證是真實的(因爲如果指針爲NULL,memset會崩潰)。

5

我認爲這是一個錯誤,原文作者的意思是這樣的:

if(marginalProbability[0]>0) 
     printf("larger"); 
    else 
     printf("smaller"); 

我不明白爲什麼他們會測試是否marginalProbability是有效的,如果他們已經要求它無條件memset()。同樣使用字表示一個值,而不是指針的比較。

+0

沒有提及代碼中的其他錯誤? – 2012-03-09 17:21:04

+0

@MooingDuck還有哪些bug? – trojanfoe 2012-03-09 17:31:28

+1

我想這是可能的,其他代碼是故意的......但它_really_看起來像編碼器打算爲10雙打而不是80ish。 – 2012-03-09 17:36:51