C:使用memsetfunction

这是我想要编写的代码:

#include  #include  #include  #include  #include  int main(int argc, char *argv[]) { float arry[3] = {0}; memset(arry, (int) 10.0, 3*sizeof(float)); return 0; } 

我的问题是我想看看是否可以使用memset使数组的每个条目都是0以外的数字。但是,在单步执行该行之后,数组内容会变为非常小的数字(0)。 我想知道在这种情况下我使用memset()函数做错了什么。 我希望这不是一个重复的post,因为我输入的所有相关问题似乎都没有。

将double转换为int只会创建二进制数00001010(二进制10),这是memset的值。 因为它是一个char,所以每个浮点数实际上都在接收位模式00001010 00001010 00001010 00001010。

Memset采用int,但将其转换为unsigned char,然后使用该位模式填充float的每个字节(sizeof(float)可能为4)。 如果这是c ++,请选择填充 :

 #include  using namespace std; //... fill (arry,arry+3,10.0); 

编号memset需要一个字节并将其写入数组。 float是一种多字节类型。

编辑:是的,我知道memset需要一个int。 但它只使用无符号字符(单个字节)来填充。

为什么不只是一个简单的for循环?

实际上你的尝试有点误导,memset在字节上工作..实际上使用浮点数为memset值没有任何意义!

浮点格式只有23 + 1位用于尾数,8位用于指数..当你在浮点数内写入原始字节值(使用memset)时你不知道你得到了什么,因为你设置了将被解释的值另一种方式!

在你的片段中,你还将它转换为(int)将包含10.0f的4字节浮点数转换为包含值10的4字节整数。但如前所述,如果你设置浮点数为10(= 0x0a)你将会最终获得浮点格式不是10.0f的0x0A0A0A0A,它可以是任何值(也非常接近0,就像你的情况一样)。

实际上,当你想要初始化一个字符数组时, memset很有用(因为你有效地获得每个字符的值,因为它们长1个字节),或者当你想要将所有字符串设置为0(NULL)时,它适用于每种基本类型的数据..