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

时间:2015-09-02 23:03:35

标签: c++ arrays memory 3d

我正在通过初始化列表将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 =括号中的字符串组数
  • y =每组中的字符串数
  • z =每个字符串中的字符数

这通常不会让我担心,因为一切都被复制了。但是,在赋值之后,应该在内存中连续的最内层值与额外维度的倍数间隔开。而不是" -x"和" -o"例如,它们被20个字节隔开,实际上它们相隔20 * 20个字节。我很困惑。如何在不增加额外维度的情况下使其工作?

1 个答案:

答案 0 :(得分:0)

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

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]
                        '\0'  // 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