【问题标题】:Why is extra bracket required in C++ 3d array list assignment?为什么在 C++ 3d 数组列表分配中需要额外的括号?
【发布时间】:2015-09-02 23:03:34
【问题描述】:

我通过初始化列表将 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 个字节分隔。我很困惑。如何在不添加额外维度的情况下使其工作?

【问题讨论】:

  • “看似有效,但做不到”是什么意思?
  • 什么?! 你是要求[20][20][20]的人。如果你只想要[3][3][3],你可以改变你的结构。
  • "-x" 不能存储在字符中。你实际上想要char* array [3][3][3]; 或只是'x' 和char。
  • 关于字符数组的常见问题。考虑使用 std::string,这样你就只有 2 维了。

标签: c++ arrays memory 3d


【解决方案1】:

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

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

【讨论】:

  • 中的第二对是否仅对应于数组结构本身,而不考虑维度?我认为这就是让我感到震惊的原因。通过您的转换,它显示 3 个维度的大括号数为 4,我一直认为大括号数等于维度数。
  • 对于数组初始化,每个维度确实有 1 个大括号级别,其中包含该维度的元素。在这里你来到 4 因为在 3 个维度的顶部你有结构。 char 数组的棘手之处在于它们可以用字符串表示,而不需要额外的大括号。
猜你喜欢
  • 1970-01-01
  • 2015-05-15
  • 1970-01-01
  • 2014-02-10
  • 2018-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-09
相关资源
最近更新 更多