有没有办法找到多维数组的细节? I.E.一个[5] [3] [6]
我希望能够将它传递给函数以对内容进行一些基本操作,但是可以选择为函数提供一个,两个和三个Dim数组。这条路 我可以减少我的代码,只需添加额外的循环来执行额外的列。
我已经看过用于查找数组长度的代码,但它仅适用于单身人士。我想如果我要做一个sizeof()类型的调用它会给我整个总数,我需要一个列/行分解。
答案 0 :(得分:6)
C中的多维数组只是数组数组,因为您可以检查每个子数组之间的sizeof
:
#include <stdio.h>
int main(void)
{
int a[5][3][6];
int dimx, dimy, dimz;
dimx = (int) (sizeof a / sizeof a[0]);
dimy = (int) (sizeof a[0] / sizeof a[0][0]);
dimz = (int) (sizeof a[0][0] / sizeof a[0][0][0]);
printf("dimx = %d, dimy = %d, dimz = %d\n", dimx, dimy, dimz);
return 0;
}
结果:
dimx = 5,dimy = 3,dimz = 6
请注意,sizeof
运算符会返回类型为size_t
的结果,因此最好将其结果投射(以避免例如GCC中的-Wconversion
标记警告)。如果您愿意,您可能还想创建类似函数的宏:
#define ARRAY_SIZE_3D_X(a) ((int) (sizeof a / sizeof a[0])
#define ARRAY_SIZE_3D_Y(a) ((int) (sizeof a[0] / sizeof a[0][0])
#define ARRAY_SIZE_3D_Z(a) ((int) (sizeof a[0][0] / sizeof a[0][0][0])
正如@pmg所指出的,如果您更喜欢size_t
直接输入,请改用以下内容:
#include <stdio.h>
int main(void)
{
int a[5][3][6];
size_t dimx, dimy, dimz;
dimx = sizeof a / sizeof a[0];
dimy = sizeof a[0] / sizeof a[0][0];
dimz = sizeof a[0][0] / sizeof a[0][0][0];
#if __STDC_VERSION__ >= 199901L
printf("dimx = %zu, dimy = %zu, dimz = %zu\n", dimx, dimy, dimz);
#else
printf("dimx = %lu, dimy = %lu, dimz = %lu\n", (unsigned long) dimx,
(unsigned long) dimy, (unsigned long) dimz);
#endif
return 0;
}
请注意通常的算术转换在单个表达式中混合有符号和无符号值(例如int
和unsigned long
)会有问题,就像无符号类型一样如果排名大于或等于签名类型,则签名值将提升为无符号,例如-5
现在是一个大整数。
答案 1 :(得分:3)
确定传递给函数的可变大小数组的维度基本上没有用处。作为参数传递的数组名称衰减为指针,函数中的sizeof
只会给出相应类型指针的大小,而不是原始数组的大小。
如果您以HPC中使用的“规范”方式表示多维数组(您使用一维数组并自行进行索引计算),则可以更容易地容纳具有可变数量维和大小的数组,如{{{ 3}},但是你仍然会遇到大小问题,你可以将它作为附加整数参数传递给你的函数,或者你可以将所有东西打包在一个结构中,例如:
typedef struct {
int *data;
int nx;
int ny;
int nz;
} matrix3;
this post详细介绍了处理密集三维矩阵的常用方法的索引计算和内存分配。