为什么在 C++ 3d 数组列表分配中需要额外的括号?

Why is extra bracket required in C++ 3d array list assignment?

我正在通过初始化列表将 3D 数组分配给结构,以利用成员复制。我有兴趣做一些描述的事情 in this post about array copying

这似乎可行,但如果不添加一组额外的括号就无法完成:

struct Options
   {
   char array [20][20][20];
   };

int main(void)
   {
   Options K = {{ { "-x", "-o" }, { "-y", "-p", "-q" }, {"-r", "-s"} }};
   };

最外层的括号用于封装赋值。下一对是我无法解释的额外一对。要分配的 3 个维度是:

这通常不会让我担心,因为所有内容都会被复制。然而,在赋值之后,内存中应该连续的最内层值被一个额外维度的倍数隔开。例如,不是“-x”和“-o”以 20 字节分隔,而是实际以 20 * 20 字节分隔。我很困惑。如何在不添加额外维度的情况下让它工作?

直接在您的代码中回答您的问题:

Options K = {  // struct
              { // array 
                 {  // array[0]
                     "-x", // array[0][0] with 3 chars, as string literal 
                     {     // array[0][1] with 3 chars, transformed in braced form by me
                        '-',  // array[0][1][0]
                        'o',  // array[0][1][1]
                        '[=10=]'  // array[0][1][2]
                      } 
                 },
                 {  // array[1]
                    "-y", "-p", "-q" 
                 },
                 {  // array[2]
                    "-r", "-s"
                 }
               }
            };

如果你输出这个数组,你自然会得到类似的东西(用点替换不可打印的'\0':

- x . . . . . . . . . . . . . . . . . .   // A first 2D array contained in array[0]
- o . . . . . . . . . . . . . . . . . .   // note that each line is exactly 20 chars long
. . . . . . . . . . . . . . . . . . . . 
(followed by 17 similar empty lines)
- y . . . . . . . . . . . . . . . . . .   // A second 2D array contained in array[1] 
- p . . . . . . . . . . . . . . . . . . 
- q . . . . . . . . . . . . . . . . . . 
(etc)

Live demo