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 个字节。除非double
值C
的所有字节都相同,否则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
,而不是您正确解释的语义。关于memset
对double
数组的影响,您的解释是片面的。显然,我不是唯一一个认为它不足的人。以上是关于C 中的 memset() 未初始化为 const double;的主要内容,如果未能解决你的问题,请参考以下文章