0

如果我有一个像这样声明的大一维数组

1darray = malloc(N*sizeof(double))

我有另一个这样声明的结构

for j:A

  2dstructure[j] = malloc(C[j]*sizeof(double*))     

  for i:B

    2dstructure[j][i] = malloc(D*sizeof(double))

  end
end

而A*B的大小=N,也就是说sizeof(1darray) == sizeof(2dstructure)

有没有一种方法可以在不使用循环的情况下将 1d 数组中的内容复制到 2d 结构中?

4

3 回答 3

3

是的,您可以将 2D 索引映射到线性 1D 索引,因此:

int idx = j*B + i;

此时,1darray[idx]等价于2dstructure[j][i]

于 2013-05-29T18:14:06.780 回答
2

假设您有一个像这样初始化的一维 N 元素数组:

double *onedarray = malloc(N*sizeof(double));

您想创建一个 2D AxB 元素数组,其中 A*B = N。您可以将 2D 数组的数据创建为一个连续的内存块,如下所示:

double *twoddata = malloc(A*B*sizeof(double));

然后分别创建结构,如下所示:

double **twodstructure = malloc(A*sizeof(double*));
for (int i = 0; i < A; i++)
  twodstructure[i] = &twoddata[i*B];

然后从一维数组复制到二维数组,就是一个简单的memcpy:

memcpy(twoddata, onedarray, N*sizeof(double));

您可以使用以下代码以结构化方式访问您的二维数组:

for (int i = 0; i < A; i++)
  for (int j = 0; j < B; j++)
    printf("%f\n", twodstructure[i][j]);
于 2013-05-29T18:45:51.240 回答
1

使用您的分配模式,由于第二个循环中的多次分配,您无法进行简单的复制。这取决于你真正追求的是什么。您可以安排一些事情,以便只分配一组指针 - 通过将指针设置到当前的 1D 数组中,以便您可以将其作为 2D 数组访问。或者,您可以创建一维数组的副本,然后设置指针(2 个分配、1 个副本、1 个初始化循环)。由于唯一的问题是是否复制原始分配,因此主要答案将适用于原始数据。

你有:

int N, A, B;
A = ...;
B = ...;
N = A * B;

double *a_1d = malloc(N * sizeof(double));

...check and load a_1d...

现在您可以通过以下方式创建二维“数组”:

double **a_2d = malloc(A * sizeof(double *));

...check that allocation succeeded...

for (int i = 0; i < A; i++)
    a_2d[i] = &a_1d[i * B];

完成此初始化后,您现在可以使用:

for (int i = 0; i < A; i++)
    for (int j = 0; j < B; j++)
        a_2d[i][j] = ...;

如果你真的需要复制原始a_1d数组,你会添加:

double *a_1d_copy = malloc(N * sizeof(double));
...check that the allocation succeeded...
memmove(a_1d_copy, a_1d, N * sizeof(double));

然后您可以参考a_1d_copy而不是a_1d在设置中a_2d

请记住,当需要释放东西时,您需要同时释放a_1da_2da_2d_copy如果您正在使用它)。

于 2013-05-29T20:51:26.087 回答