我正在编写一个返回指向数组数组的指针的函数。为了能够使用指针迭代数字,我将最后一个元素设置为NAN
以标记数组的结尾。
我的循环就像是
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
作为“塞子”的例子。那为什么不起作用?
答案 0 :(得分:5)
您有未定义的行为,因为您尝试将NAN
(浮点类型)转换为int
,并且该值无法由int
表示。
§4.9/ 1 [conf.fpint] 浮点类型的prvalue可以转换为整数类型的prvalue。转换截断;也就是说,丢弃小数部分。如果截断的值无法在目标类型中表示,则行为未定义。
由于NAN
只是浮点数的特殊值,因此将它存储在int
中是没有意义的。整数类型没有特殊的非数字值。你可以使用一些特定的值来表示数组的结尾,但这不是一个特别令人愉快的解决方案。
如果您要像这样动态分配数组,则必须通过传递它来自己跟踪它的大小。对于其他数组(您实际上有一些表示数组对象本身的东西,而不仅仅是指向其元素的指针),您可以使用std::end
来查找它的结尾。但是,像往常一样,我建议使用标准容器。
答案 1 :(得分:2)
isnan()
仅适用于浮点。