C分配双精度的动态数组并用memset初始化它[重复]

Posted

技术标签:

【中文标题】C分配双精度的动态数组并用memset初始化它[重复]【英文标题】:C allocating dynamic array of doubles and initializing it with memset [duplicate] 【发布时间】:2016-03-10 15:35:53 【问题描述】:

我知道这个问题非常基础,但即使在网上进行了长时间的搜索后,我也找不到解决问题的方法。我想熟悉 C 中的动态数组,特别是使用 malloc() 进行分配和使用 memset() 进行初始化,所以这是我的代码:

#include <stdlib.h>

int main()
   
  double *d;
  int numElements = 3;
  size_t size = numElements * sizeof(double);
  d = malloc(size);
  memset(d,1.0,size);

  int i;
  for(i=0; i < numElements; i++)
    printf("%f\n",d[i]);

  return 0;

但我得到的输出与我期望的不同

0.0
0.0
0.0

拜托,谁能这么温柔地解释一下我做错了什么?

谢谢!

【问题讨论】:

注意:他们说you shouldn't cast the result of malloc() in C。 @MikeCAT 如果我不转换 malloc() 的结果,我会得到相同的结果 这应该向您表明演员阵容完全没有意义,这就是您不应该使用它的原因 - 它只会增加混乱。 0x0101010101010101 is the byte representation of 7.74860418548934791663872901834E-304 【参考方案1】:

因为 memset 适用于字节

sizeof(double)==8, 所以数组中的每个双精度值都填充了值 0x0101010101010101

只需将 memset 替换为:

for (int i=0;i< numElements;i++) d[i]=1;

【讨论】:

以上是关于C分配双精度的动态数组并用memset初始化它[重复]的主要内容,如果未能解决你的问题,请参考以下文章

二维数组的动态分配(new)初始化(memset)和撤销(delete)

C、memset一个双数组失败

获得两个双精度数组绝对差之和的有效方法

正确使用 memset 与动态分配的多维数组

对二维数组的“memset”的混淆和“free”的错误

C++ 优化 - 堆栈分配的数组类型与外部链接维度?