使用 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() 函数我做错了什么。 我希望这不是重复的帖子,因为我在输入此内容时似乎没有建议的相关问题。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
Memset 接受一个 int,但将其转换为无符号字符,然后填充float 的每个字节(sizeof(float) 可能是 4)都具有该位模式。 如果这是 C++,则更喜欢使用 fill 代替:
Memset takes a int, but casts it to an unsigned char, and then fills each byte of float (sizeof(float) is probably 4) with that bit pattern. If this is c++, prefer fill instead:
将 double 转换为 int 只会创建二进制数 00001010(二进制为 10),这就是 memset 的值。 由于它是一个字符,因此每个浮点实际上都接收位模式 00001010 00001010 00001010 00001010。
Casting a double to an int just creates the binary number 00001010 (10 in binary), and that is the value that is memset'ed. Since it's a char, each of your floats is actually receiving the bit pattern 00001010 00001010 00001010 00001010.
不。memset 接受一个字节并将其写入数组。 float 是一种多字节类型。
编辑:是的,我知道 memset 需要一个 int 。 但它只使用一个unsigned char(单个字节)来填充。
No. memset takes a single byte and writes it to the array. A float is a multi-byte type.
EDIT: Yes, I know memset takes an int. But it only uses an unsigned char (a single byte) to fill with.
为什么不只是一个简单的
for
循环呢?Why not just a simple
for
loop?实际上你的尝试有点误导,memset 适用于字节..实际上使用 float 作为 memset 值没有任何意义!
浮点格式只有 23+1 位用于尾数,8 位用于指数。当您在浮点中写入原始字节值(使用 memset)时,您不知道您将获得什么,因为您正在设置将被解释的值另一种方式!
在您的代码片段中,您还可以将其转换为 (int) 将包含 10.0f 的 4 字节浮点数转换为包含值 10 的 4 字节整数。但是如前所述,如果您用 10 (= 0x0a) memset 一个浮点数,您将最终获得的 0x0A0A0A0A 不是浮点格式的 10.0f,它可以是任何值(也可以是非常接近 0 的值,就像您的情况一样)。
实际上,当您想要初始化一个字符数组时(因为您可以有效地获得每个字符的值,因为它们的长度为 1 个字节),或者当您想要设置时,
memset
很有用一切都为 0(NULL),适用于每种基本类型的数据。Actually your try is a little bit misleading, memset works on bytes.. actually using a float for memset value doesn't make any sense!
The float format just has 23+1 bits for mantissa and 8 bits for exponent.. when you write raw bytes values (using memset) inside a float you don't know what you are obtaining because you are setting values that will be interpreted in a different way!
In your snippet you also cast it to (int) turning a 4-bytes float containing 10.0f in a 4-bytes integer containing the value 10.. but as said before if you memset a float with 10 (= 0x0a) you'll end up obtaining 0x0A0A0A0A that is not 10.0f in float format, it can be whatever value (also something very near to 0, like in your case).
Actually
memset
is useful when you want to initialize an array of chars (since you obtain effectively that value for every char because they are 1 byte long) or when you want to set everything to 0 (NULL) that works for every basic kind of data..