使用memset初始化float数组

时间:2009-06-24 18:23:54

标签: c memset

这是我想尝试编写的代码:

#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()函数做错了什么。我希望这不是一个重复的帖子,因为我输入的内容似乎都不是建议的相关问题。

5 个答案:

答案 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),适用于每种基本类型的数据..