10

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

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

4

5 回答 5

15

Memset接受一个 int,但将其转换为一个 unsigned char,然后用该位模式填充 float 的每个字节(sizeof(float) 可能是 4)。如果这是 c++,则更喜欢填充

#include <algorithm>
using namespace std;

//...

fill (arry,arry+3,10.0);
于 2009-06-24T18:32:20.563 回答
10

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

于 2009-06-24T18:26:59.807 回答
8

不,memset 需要一个字节并将其写入数组。浮点数是多字节类型。

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

于 2009-06-24T18:26:30.930 回答
4

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

于 2009-06-24T20:34:19.853 回答
3

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

浮点格式只有 23+1 位用于尾数,8 位用于指数。当您在浮点数中写入原始字节值(使用 memset)时,您不知道您正在获得什么,因为您正在设置将被解释的值不同的方式!

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

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

于 2009-06-24T18:44:51.447 回答