遍历3D数组

时间:2019-10-18 22:20:19

标签: c arrays

我一直在尝试使用for循环来尝试迭代并打印出数组。当我尝试打印时,我得到了这些随机数,但我不知道它们来自何处。

 const char segments[10][3][3] =
        {
                {{' ', '_', ' '}, {'|', ' ', '|'}, {'|', "_", '|'}}, // segments for 0
                {{' ', ' ', ' '}, {' ', '|', ' '}, {' ', "|", ' '}}, // segments for 1
                {{' ', '_', ' '}, {' ', '_', '|'}, {'|', "_", ' '}}, // segments for 2
                {{' ', '_', ' '}, {' ', '_', '|'}, {' ', "_", '|'}}, // segments for 3
                {{' ', ' ', ' '}, {'|', '_', '|'}, {' ', " ", '|'}}, // segments for 4
                {{' ', '_', ' '}, {'|', '_', ' '}, {' ', "_", '|'}}, // segments for 5
                {{' ', '_', ' '}, {'|', '_', ' '}, {'|', "_", '|'}}, // segments for 6
                {{' ', '_', ' '}, {' ', ' ', '|'}, {' ', " ", '|'}}, // segments for 7
                {{' ', '_', ' '}, {'|', '_', '|'}, {'|', "_", '|'}}, // segments for 8
                {{' ', '_', ' '}, {'|', '_', '|'}, {' ', "_", '|'}}, // segments for 9
        };


for (int k = 0; k < sizeof(segments); k++){
    for(int j = 0; j < sizeof(segments); j++){
        for (int i = 0; i < sizeof(segments); ++i) {
            printf("%c", segments[k][j][i]);
        }
    }
    printf("\n");
}

运行代码时,它会向我输出如下内容:

| _ | �| _ | _�| _ | _ |�| _ | �| _ | _ |||| _ | | …| ##z���Z��ث�| | �| _ | _�| _ | _ |�| _ | �| _ | _ |||| _ | _ | …| ##z���Z��ث�|| _ | _�| _ | _ |�| _ | �| _ | _ |||| _ | _ | || ##z���Z��ث�_ | _�| _ | _ |�| _ | �| _ | _ |||| _ | | …| ##z���Z��ث�| �| _ | _ |�| _ | �| _ | _ |||| _ | _ | …| ##z���Z��ث�|| _ | _ |�| _ | �| _ | _ |||| _ | _ | _ | ##z���Z��ث�_ | _ |�| _ | �| _ | _ |||| _ | | || ##z���Z��ث�| |�| _ | �| _ | _ |||| _ | _ | …| ##z���Z��ث�||| _ | �| _ | _ |||| _ | _ | || ##z���Z��ث_ | �| _ | _ |||| _ | _ | || ##z���Z��ث。| �| _ | _ |||| _ | _ | …| ##z���Z��ث�|| _ | _ |||| _ | _ | _ || ##z���Z��ث�@ _ | _ ||。| _ | | �| ##z���Z��ث�@�Z| ||。| _ | _ | �|#�z���Z��ث�@�Z|�| _ | _ | �| ##z���Z��ث�@�Z_ | | …| ##z���Z��ث�@�Zұ4| | …| ##z���Z��ث�@�Zұ4Y�|

1 个答案:

答案 0 :(得分:2)

sizeof(segments)获取内存中整个数组的大小,而不是其任何轴的长度。

根据对this question的最高回答,您仍然可以使用sizeof,只需要在数组的不同部分使用它:要获得每个轴的长度,除以其总长度通过其元素之一的长度。

some_type_t const array[I][J][K] = ARRAY_INITIALIZER;

// array size over size of subarray
size_t const i_max = sizeof(array) / sizeof(array[0]);

// subarray size over size of sub-sub-array
size_t const j_max = sizeof(array[0]) /
                     sizeof(array[0][0]);

// sub-sub-array size over size of one element
size_t const k_max = sizeof(array[0][0]) /
                     sizeof(array[0][0][0]);

for (size_t i = 0; i < i_max; ++i) {
    for (size_t j = 0; j < j_max; ++j) {
        for (size_t k = 0; k < k_max; ++k) {
            // do something with array[i][j][k]
        }
    }
}

根据相同的答案,您可以使用以下宏自动生成这些表达式。

#define NELEMS(x)  (sizeof(x) / sizeof((x)[0]))

int a[17];
size_t n = NELEMS(a);

为什么起作用

您可能期望sizeof(array[0])在零长度数组上失败,这可能会让您犹豫使用它。但请放心,这对任何(非可变长度)数组都适用。

C标准this draft的第80页描述了sizeof运算符的工作方式:

如果sizeof除了可变长度数组之外还提供其他任何内容,它就不会对其进行求值-编译器可以找出操作数的大小,并且仅使用该值。

因此,在上例中定义了array之后,编译器知道array的任何元素的类型都是“ length- J 长度为<< em>的数组some_type_t”(即some_type_t[J][K])的K 数组。它还知道 J K 的值,因为它们需要是内联常量,因此可以确定数组中任何元素的大小。

因此,使用什么索引查找元素的大小都没有关系,只要它是整数即可。 sizeof(array[0])可以与空数组配合使用,就像sizeof(array[-1])sizeof(array[124124])一样(尽管您应始终使用0以避免混淆人们)。

事实上,标准草案甚至以它为例:

  
      
  1. 示例2 sizeof运算符的另一用途是计算数组中元素的数量:
    sizeof array / sizeof array[0]
    
  2.   

如果标准建议这样做,那可能是一种很好的方法。