在C中初始化高维数组的最佳方法是什么?

时间:2014-04-02 03:09:30

标签: c

我们说我有一个9维数组:

int arr[4][4][4][4][4][4][4][4][4];

我想将每个元素初始化为1。

我知道我可以使用多个循环初始化它:

for(int i1 = 0; i1 < 4; i ++) {
     ...// eight more similiar loops
}

但它看起来很难看。

这样做的最佳做法是什么?也许我可以使用宏?

4 个答案:

答案 0 :(得分:2)

在C中,多维数组是连续的,因此您可以通过指针初始化arr来利用这一点。

    int* parr = (int*)arr;
    for (int i = 0; i < ((sizeof(arr)/sizeof(int)); ++i)
        parr[i] = 1;

请注意,这在数组分解为指针的情况下不起作用(例如,如果它作为参数传递给函数)。

答案 1 :(得分:1)

这样写:

int *p = &arr[0][0][0][0][0][0][0][0][0];
for( int i = 0; i < 4*4*4*4*4*4*4*4*4; i++)
    *p++ = 1;

@nuk因为arr是一个类型

int[4][4][4][4][4][4][4][4][4] // 9 of '[4]'

所以

int arr[4][4][4][4][4][4][4][4][4];
sizeof(arr) = sizeof(int[4][4][4][4][4][4][4][4][4]);
            = sizeof(int)  *4*4*4*4*4*4*4*4*4;

但如果你在这里传递指针,

int* arr;
sizeof(arr) = sizeof(int*)
            = sizeof(void*)
            = Usually the target file's BIT / 8

答案 2 :(得分:0)

也许使用递归函数,该函数传递初始化所需的数字级别。

void init(int * arr, int level, int size, int value)
{
     for(int i = 0; i < size; i++)
     {
          if(level == 0)
              arr[i] = value;
          else
              init(arr[i], level - 1, size, value);
     }
}

答案 3 :(得分:0)

如果你想初始化为零,那么一个好的memset就可以做到:

int arr[4][4][4][4][4][4][4][4][4];
memset(&arr, 0, sizeof(arr));

那说,但是,既然你想要初始化为1,我应该说在C中使用9D数组通常看起来至少有点糟糕。你总是要在任何地方声明那种严苛的类型你将它传递给一个函数,你将永远无法以任何通用的方式使用间接索引。只是声明一个2 18 int - 数组并且手动计算索引,你可能更好。当然,这是你的背景,所以不是因为你没有理由。 :)