C 中的 memset() 未初始化为 const double;

Posted

技术标签:

【中文标题】C 中的 memset() 未初始化为 const double;【英文标题】:memset() in C not initialising to a const double; 【发布时间】:2015-06-06 06:51:04 【问题描述】:

您好,我有以下用 C 语言为 x86 编写的代码,

const double N = 4;
const double C = 1.0 / N; <---- 0.2500

double *array = (double*)calloc(10, sizeof(double));

memset(array, C, 10);

memset 的结果只为每个元素返回 0.0000,而不是存储在 C.. 中的值。

有人可以帮忙吗?

【问题讨论】:

“memset() 函数用常量字节 c 填充 s 指向的内存区域的前 n 个字节。” double 不是字节。 没有办法存储double吗? 您可以手动循环播放。 如果我决定手动循环,是否会在时间方面进行权衡? 可能会有,但我认为工作与不工作的权衡更为重要。 【参考方案1】:

memset 用给定的字节值初始化一块内存。字节为unsigned char,比double 小得多,double 在您的架构上使用 8 个字节。除非doubleC 的所有字节都相同,否则memset 不能用于初始化double 值数组。在 IEEE-754 兼容系统(例如各种 x86 变体)上,+0.0 具有所有字节和所有位 0,因此您可以使用 memset(array[i], 0, 10 * sizeof(double)) 将数组初始化为 0.0,但这既不可读也不可移植。对于大多数其他值,根本不可能。

您必须使用简单的for 循环:

for (int i = 0; i < 10; i++)
    array[i] = C;

编译器会优化循环,特别是如果 C 是编译时间常数。

【讨论】:

【参考方案2】:
void *memset(void *s, int c, size_t n);

memset 接受一个 int 或一个常量字节来填充内存。

您提供的值是double。那么memset 将如何处理呢?

您提供的值将被隐式转换为 int 然后 转换后的值将再次转换为 unsigned char 以获得一个字节 价值

另外,memset 的 size_t 参数是字节数。您应该使用 10 * sizeof(double) 而不仅仅是 10

【讨论】:

您的解释有点令人困惑:内存不是用 const double C 填充而是强制转换为 int。并且 OP 无法通过使用另一个 double 值来确认任何内容,他可能对内存的组织方式了解不足。甚至编译器警告也令人困惑:int array[10]; memset(array, 123456789, 10); 将在没有警告的情况下编译,但远未完成目标。 用值 5 填充内存 在字节级别是正确的,但是内存以double 访问,OP 仍然无法理解您的解释,无法验证值5,更不用说大小参数是10 而不是10 * sizeof(double) @chqrlie:: 我想,现在已经不那么令人困惑了。该警告是不言自明的。 正如我在之前的评论中解释的那样,该警告令人困惑,因为它仅与 memset 的原型有关,出于历史原因采用 int,而不是您正确解释的语义。关于memsetdouble 数组的影响,您的解释是片面的。显然,我不是唯一一个认为它不足的人。

以上是关于C 中的 memset() 未初始化为 const double;的主要内容,如果未能解决你的问题,请参考以下文章

在JAVA中有没有象C语言里的memset函数

c语言中怎么把一维数组初始化为全零啊,不用循环

C/C++ 将 char 数组初始化为 const char*

<c语言>如何将数组初始化为0

c语言 如何将已赋值的字符串初始化为空?

11memset函数