memset bytewise 而不是整数(4 字节)

memset bytewise instead of integer ( 4 bytes )

我正在努力寻找这个问题的答案:

#define BUFLEN 8
unsigned short randombuffer[BUFLEN];    
memset(randombuffer, 200 , BUFLEN );
printf("%u", randombuffer[0]);

虽然我期待 200,但我得到的答案是 51400。 调试后我发现 randombuffer 的前 8 个条目用 0xC8 填充。因此 0xC8C8 是 51400。但是我期望数组中的每个索引都是 0x00C8。 我做错了什么?

memset 填充字节,但看起来你想要填充单词。我不知道是否为此内置了类似 memset 的函数,因此您可能不得不重复执行 memset/memcpy。请注意,如果您觉得编写内联汇编程序很舒服,您自己可以在机器代码中非常有效地完成此操作 - 尽管在 C 中使用指针的紧密循环可能接近同样快。

memset 调用中的大小计算不正确。应该是:

memset(randombuffer, 200 , BUFLEN * sizeof(*randombuffer) );

因为 randombuffer 中的单个元素在您的情况下是两个字节,而 memset 中的第三个参数占用对象的字节数,因此您必须传递对象中元素的数量乘以它们的大小(以字节为单位)。

元素中的值仍将保持为 0xC8C8,因为 memset 按字节而不是按元素设置值。

要正确打印它们,请为 short 使用正确的说明符:

printf("%hu", randombuffer[0]);

printf("%hx", randombuffer[0]);

你做错的是没有阅读 memset 的规范。 memset 将每个 byte 设置为指定值。您的缓冲区很可能有 8 个条目,每个条目两个字节。由于您将 8 传递给 memset,因此前四个条目的两个字节都已更改,其余部分未被触及。这就是 memset 的作用。