2014-01-16 51 views
0

我正在寫一個函數,它返回一個指向數組數組的指針。爲了能夠使用指針迭代數字,我將最後一個元素設置爲NAN以標記數組的末尾。
我的循環是像當通過指針訪問時,NAN是否返回false?

for(int* it=ptr;!isnan(*it);++it) 
//print *it 

但它一直走,直到它墜毀所以我寫了一些測試代碼:

int* test = new int[1]; 
*test = NAN; 
cout << isnan(NAN) << endl; 
cout << isnan(*test) << endl; 

,結果是:

1 
0 

我所看到的在陣列中使用NAN作爲「塞子」的許多示例。那麼爲什麼不這樣做?

+4

'NAN'是一個特殊的浮點值(對於'float's /'double's) - 整數類型沒有'NAN'。 –

+0

您應該只存儲數組的大小而不是使用一些標記值。 – Simple

+0

s /'塞子'/哨兵。 – MSalters

回答

5

您有未定義的行爲,因爲您試圖將NAN(浮點類型)轉換爲int,並且該值不能由int表示。

§4.9/ 1 [conf.fpint]一個FL浮點類型的prvalue可以轉換爲一個整數類型的prvalue。轉換截斷;也就是說,小數部分被丟棄。如果截斷值無法在目標類型中表示,則行爲未定義。

由於NAN只是浮點數的特殊價值,它沒有意義的,它存儲在一個int。整數類型沒有特殊的非數值。你可能使用一些特定的值來表示數組的結束,但這不是一個特別令人愉快的解決方案。

如果你要這樣動態分配你的數組,你將不得不通過傳遞它來跟蹤它的大小。對於其他數組(您實際上擁有表示數組對象本身的東西,而不僅僅是指向其元素的指針),您可以使用std::end來查找它的結尾。但是,像往常一樣,我建議使用標準容器。

+0

IIRC它的實現定義'int'是否可以具有'NaN'值。我希望老Crays支持整數NaN。 – MSalters

2

isnan()只適用於浮點。