这是我想尝试编写的代码:
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
int main(int argc, char *argv[])
{
float arry[3] = {0};
memset(arry, (int) 10.0, 3*sizeof(float));
return 0;
}
我的问题是我想看看是否可以使用memset使数组的每个条目都是0以外的数字。但是,在单步执行该行之后,数组内容会变为非常小的数字( 0)。我想知道在这种情况下我使用memset()函数做错了什么。我希望这不是一个重复的帖子,因为我输入的内容似乎都不是建议的相关问题。
答案 0 :(得分:15)
Memset接受一个int,但将其强制转换为unsigned char,然后使用该位模式填充float的每个字节(sizeof(float)可能为4)。如果这是c ++,则更喜欢fill:
#include <algorithm>
using namespace std;
//...
fill (arry,arry+3,10.0);
答案 1 :(得分:10)
将double转换为int只会创建二进制数00001010(二进制10),这是memset的值。因为它是一个字符,所以每个浮点数实际上都是接收位模式00001010 00001010 00001010 00001010。
答案 2 :(得分:8)
没有。 memset占用一个字节并将其写入数组。 float是一种多字节类型。
编辑:是的,我知道memset需要一个int。但它只使用无符号字符(单个字节)来填充。答案 3 :(得分:4)
为什么不只是一个简单的for
循环?
答案 4 :(得分:3)
实际上你的尝试有点误导,memset适用于字节..实际上使用浮点数来设置memset值没有任何意义!
float格式只有23 + 1位用于尾数,8位用于指数..当你在float中写入原始字节值(使用memset)时你不知道你得到了什么,因为你设置的值将是以不同的方式解释!
在你的片段中,你还将它转换为(int)将包含10.0f的4字节浮点数转换为包含值10的4字节整数。但如前所述,如果你设置一个10(= 0x0a)的浮点数你最终会得到浮点格式不是10.0f的0x0A0A0A0A,它可以是任何值(也非常接近0,就像你的情况一样)。
实际上, memset
在你想要初始化一个字符数组时很有用(因为你有效地获得每个字符的值,因为它们是1个字节长)或者你想要设置一切都为0(NULL),适用于每种基本类型的数据..