【问题标题】:Initializing C array after malloc'ing memorymalloc'ing内存后初始化C数组
【发布时间】:2015-09-17 07:15:45
【问题描述】:

在为它动态分配内存后,我需要在 C 中初始化一个二维数组。我分配内存如下:

double **transition_mat = (double **) malloc(SPACE_SIZE * sizeof(double *));

for (int i = 0; i < SPACE_SIZE; i++) {
    transition_mat[i] = (double *) malloc(SPACE_SIZE * sizeof(double));
}

但是我想将它初始化为某个二维数组,类似于将数组存储在堆栈上时可以完成的初始化方式:

double arr[2][2] = {{1.0, 7.0}, {4.1, 2.9}};

但是,在第一个代码段中分配内存后,尝试如下进行分配会产生错误:

transition_mat = (double **) {{1.0, 7.0}, {4.1, 2.9}};

有人知道在 malloc'ing 内存后初始化数组的干净方法吗?

注意:有人建议我遍历 0 &lt;= i &lt; SPACE_SIZE0 &lt;= j &lt; SPACE_SIZE 并以这种方式分配值。这样做的问题是不能简单地从ij 计算条目,因此代码最终看起来并不比任何蛮力方法更干净。

【问题讨论】:

  • 循环是唯​​一的方法。除非你 memcpy 来自预先存在的数组。
  • OT:在 C 中不需要,也不建议强制转换返回 void-pointers 的函数。

标签: c syntax malloc


【解决方案1】:

如果您要在代码中将所有数据作为文字(进行初始化),为什么不将其存储为显式二维数组开始并完成?

最坏的情况,从现有数组中进行动态分配和复制。

根据您需要的访问模式,将 static const 设置在函数内部或全局范围内。

【讨论】:

  • 您的意思是将其存储为函数外部的显式二维数组吗?如果我的理解是正确的,当double arr[2][2]初始化一个数组时,它存储在堆栈上,而不是堆上,所以我不能将它作为参数传递给另一个函数(我需要这样做)。
  • 当然,您可以将存储在函数内部堆栈中的内容传递给另一个函数,只要该调用来自第一个函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-18
  • 2013-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-25
相关资源
最近更新 更多