[英]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_1d
和a_2d
(如果正在使用, a_2d_copy
释放a_1d
)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.