在double类型数组中使用memset()

时间:2014-12-20 14:49:37

标签: c++

我想在双数组中将所有索引值设置为-1 这是我的代码:

double dp[505];
memset(dp,-1,sizeof(dp));
cout<<dp[0]<<"\n";

但是当我尝试打印其值时,它显示nan

nan是什么意思? 是否可以在双数组中使用memset()

7 个答案:

答案 0 :(得分:7)

memset对字节进行操作,而非浮点数,并且所有字节设置为-1的double不等于-1。我想你正在寻找std::fill

#include <algorithm>

std::fill(dp, dp + 505, -1.0);

或者,在C ++ 11中:

#include <algorithm>
#include <iterator>

std::fill(std::begin(dp), std::end(dp), -1.0);

答案 1 :(得分:7)

在C ++中,您可以写:

double initValue = -1;
std::fill_n(dp, 505, initValue);

使用非double值设置双数组将不起作用。

答案 2 :(得分:4)

您已使用字节0xFF(即char的{​​{1}}表示)设置要填充的数组的每个元素。

没有浮点数由一系列-1字节表示,因此在打印0xFF时,您会看到double(即&#39;不是数字&#39;) 。这与NaN将字节为零形成鲜明对比,这是合法的,因为0字节的字符串是memset,其值为零。请参阅Is it legal to use memset(,0,) on array of doubles?

如果您打算将每个条目设置为double(即双倍),则在C ++中使用-1.0std::fill或在C中使用循环,例如

std::fill_n

答案 3 :(得分:4)

来自memset的手册页:

  

memset()函数使用常量字节 c 填充 s 指向的内存区域的第一个 n 字节。

问题在于,您希望使用常量double填充-1.0 s数组,但sizeof(double) > 1使memset实际上填充垃圾,最终会成为一个NaN

如果您使用的是C ++,std::fill功能就是您的朋友。实际上,由于您是第一次写入阵列,std::uninitialized_fill是正确的。虽然对于内置double类型,应该没有区别,但精确总是好的。

constexpr std::size_t length = 505;
double values[length];
std::uninitialized_fill(values, values + length, -1.0);

答案 4 :(得分:2)

memset设置字节,因此您得到double - 每个字节为-1的值。

而是在C ++中使用std::vector,然后编写

vector<double> dp( 505, -1.0 );

就这么简单。


如果dp是一个全局向量,您需要多次将其设置为-1,那么您只需执行此操作:

dp = vector<double>( dp.size(), -1.0 );

但是,generally not a good idea to use non-const global variables


或者,可以使用std::fill,或仅使用循环,或仅使用仍将double值视为double值的任何技术。但std::vector也是出于许多其他原因而不是大大简化fill-it任务。特别是std::vector可以调整大小,它负责复制,它可以自动化内存管理,正确地为您做这个部分。

答案 5 :(得分:0)

nan意味着不是数字。

无法理解为什么它不起作用。 也许是因为没有设定精度:(cout.precision(15);)

检查一下: How do I print a double value with full precision using cout?

但我不确定它会起作用:o 我检查了memset源代码,负面没有问题:D

但这可能是双打的问题:

memset(dst0, c0, length) void *dst0;
register int c0;
register size_t length;

您是否尝试使用Werror标志进行编译?

答案 6 :(得分:-1)

虽然已经给出了问题的答案,但我只是想让你注意到这一点         sizeof(dp) 输出用于在内存中编码变量的字节数。

在你的情况下,dp是指向double的指针。然后它将等于指针(4)的大小,无论是否分配了memery。 sizeof(* dp)将输出double(8)的大小。 为了使用

的长度