【问题标题】:Initializing a float array with memset使用 memset 初始化浮点数组
【发布时间】:2010-11-05 14:52:45
【问题描述】:

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

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

【问题讨论】:

    标签: c memset


    【解决方案1】:

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

    【讨论】:

    • 对速度的需求是一个答案。
    • 所有 memset 要做的就是每次将内存设置一个字节。 for 循环将一次压缩 sizeof(arry) 个字节 sizeof(float) 个字节。而且没有函数调用的开销!
    • @Mark Jones:不同的是memset可以利用CPU内置的字符串处理指令,使得操作速度稍微快了一些。
    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

      Memset 接受一个 int,但将其转换为一个无符号字符,然后用该位模式填充 float 的每个字节(sizeof(float) 可能是 4)。如果这是 c++,请改用fill

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

      【讨论】:

      • 很好的建议。我会考虑使用它。
      • 如果您使用的是 C 而不是 C++,那么请寻找特定于平台的 memset 变体,它们可以编写比单个字符更大的模式。例如,如果你有 memset_pattern4。或 SIMD 指令。
      【解决方案4】:

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

      【讨论】:

      • 即实际上,使用它将数组的条目重置为零才有意义?
      • 那或者如果您正在设置一个具有其他相关值的 char 数组。
      • 或任何单字节值。最常见的可能是0,但0xFF也可能会被大量使用。
      • 或者任何整数(short、int、long 等)值,如果您需要每个整数的所有字节相同。 0 和 0xFF 是最有可能的候选对象。
      • 作为一个例子,我只是编写了一个使用这个的程序。它是一种传递给某种 GUI 对话框的参数结构,我将整个结构设置为 0x00,因为在只设置我关心的几个字段之前,该位模式适用于所有事物(指针、浮点数等)。跨度>
      【解决方案5】:

      没有。 memset 获取一个字节并将其写入数组。浮点数是多字节类型。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-24
        • 1970-01-01
        • 1970-01-01
        • 2018-02-26
        • 1970-01-01
        • 2012-09-29
        相关资源
        最近更新 更多