繁体   English   中英

如何在不使用c循环的情况下将1d数组复制到2d结构中?

[英]can I copy a 1d array into a 2d structure without using a loop in c?

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

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结构中?

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

int idx = j*B + i;

在这一点上, 1darray[idx]等效于2dstructure[j][i]

假设您有一个像这样初始化的一维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(twoddata, onedarray, N*sizeof(double));

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

for (int i = 0; i < A; i++)
  for (int j = 0; j < B; j++)
    printf("%f\n", twodstructure[i][j]);

使用分配模式,由于第二个循环中有多个分配,因此无法执行简单的复制。 这取决于您的真正追求。 您可以安排事情,以便只对一组指针进行一次分配-通过将指针设置到当前的1D数组中,以便可以将其作为2D数组进行访问。 或者,您可以创建1D数组的副本,然后设置指针(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_2d (如果正在使用, a_2d_copy释放a_1d )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM